1 Introducción y definición de objetivos

Nos complace presentar un innovador proyecto de machine learning enfocado en la transformación digital del sector asegurador. El objetivo principal es abordar dos desafíos clave en la industria; el análisis exploratorio de los datos de la compañía aseguradora LS y la creación de modelos predictivos para estimar el coste de siniestros y clasificarlos de manera eficiente.

En primer lugar, el análisis exploratorio nos permitirá identificar patrones, tendencias y posibles anomalías en el conjunto de datos proporcionado por la compañía aseguradora. Mediante técnicas avanzadas de visualización y análisis estadístico, seremos capaces de extraer información valiosa y descubrir oportunidades de mejora en la gestión de riesgos y la toma de decisiones.

En segundo lugar, el desarrollo de modelos predictivos basados en machine learning nos permitirá anticiparnos a los costes de siniestros y clasificarlos de manera más precisa. Estos modelos, entrenados con un vasto conjunto de datos históricos, nos brindarán una herramienta eficaz para optimizar la evaluación del riesgo, la asignación de recursos y el diseño de estrategias de prevención.

Con la implementación de este proyecto, aspiramos a impulsar la eficiencia operativa y la rentabilidad de la compañía aseguradora, así como mejorar la calidad del servicio ofrecido a sus clientes. Estamos convencidos de que la adopción de tecnologías de machine learning y el análisis de datos en el sector asegurador es crucial para mantenerse competitivo en un mercado cada vez más exigente y en constante evolución.

¡Síguenos en este apasionante viaje hacia la digitalización e innovación en el mundo de los seguros!


2 Análisis exploratorio inicial

paste(R.Version()$version.string)
## [1] "R version 4.1.2 (2021-11-01)"
library(readr) # Lectura de datos especialmente CSVs
library(readxl) # Lectura de datos especialmente Excel (.xls y .xlsx)
library(dplyr) # Para manipulación y transformación de datos en R
library(tidyr) # Permite manipular la forma de conjuntos de datos en R
library(DT) # Mejora el trabajo con dataframes
library(kableExtra) # Mejora y estiliza tablas
library(ggplot2) # Para gráficos en R
library(GGally) # Extensión de ggplot2, facilitando la visualización de pares y combinaciones de datos
library(gridExtra) # Herramientas para trabajar con múltiples gráficos de ggplot2
library(cowplot) # Para mejoras de gráficos de ggplot2
library(ggcorrplot) # Visualización de matrices de correlación usando ggplot2
library(gmodels) # Varios modelos matemáticos y herramientas estadísticas
library(ggfortify) # Extensión de ggplot2 con funciones para visualizar resultados de varios modelos estadísticos
library(ggridges) # Para hacer Density Ridgeline Plot que son diagramas de densidad por agrupaciones que definamos
library(caret) # Construcción y evaluación de modelos de aprendizaje automático
library(scales) # Herramientas de escalado y formateo de datos
library(class) # Funciones para clasificación
library(distances) # Herramientas para trabajar con distancias y métricas
library(visreg) # Visualización de modelos de regresión
library(rpart) # Paquete de partición recursiva y árboles de regresión
library(rpart.plot) # Visualización de árboles rpart
library(rattle) # Interfaz gráfica y utilidades para minería de datos
library(randomForest) # Paquete que implementa el algoritmo de Random Forest para clasificación y regresión
library(e1071) # Funciones de estadística y aprendizaje automático, incluye máquinas de soporte vectorial
library(pROC) # Herramientas para visualizar y comparar ROC curves
library(cluster) # Métodos de clustering
library(tidyverse) # Colección de paquetes relacionados con la manipulación y visualización de datos (incluye ggplot2, dplyr, tidyr ...)
library(stringr) # Manipulación de cadenas de caracteres
library(Metrics) # Funciones para calcular métricas de modelos predictivos
library(factoextra) # Herramientas de visualización para resultados de descomposición
library(NbClust) # Determina y proporciona el número óptimo de clusters por diferentes métodos

2.1 Lectura y preparación de los datos

Leemos el dataset original.

LS_original <- read_excel("LS.xlsx")
LS <- LS_original %>% mutate_at(vars("f_ocurrencia", "f_declaracion", "f_cierre"), as.Date)
str(LS)
## tibble [143,930 × 15] (S3: tbl_df/tbl/data.frame)
##  $ siniestro       : chr [1:143930] "LS_AS0000000089" "LS_AS0000000092" "LS_AS0000000094" "LS_AS0000000095" ...
##  $ producto        : chr [1:143930] "CROH" "CRSCEP" "CRMM" "SPF" ...
##  $ ramo            : chr [1:143930] "DJ" "DJ" "DJ" "DJ" ...
##  $ tipo            : chr [1:143930] "RA" "RA" "RA" "SD" ...
##  $ f_ocurrencia    : Date[1:143930], format: "2014-02-20" "2014-03-14" ...
##  $ f_declaracion   : Date[1:143930], format: "2014-02-25" "2014-03-20" ...
##  $ f_cierre        : Date[1:143930], format: "2014-02-25" "2014-04-25" ...
##  $ estado          : chr [1:143930] "TERMINADO" "TERMINADO" "TERMINADO" "TERMINADO" ...
##  $ cobertura       : chr [1:143930] "CONTRATOS LABORALES: CONFLICTOS INDIVIDUALES DE TRABAJO (SOLO ANTE LA EMPRESA EMPLEADORA)" "RECLAMACION DAÑOS NO CONTRACTUAL MATERIALES" "DCHOS RELATIVOS VIVIENDA: RECLAMACION DAÑOS DE TERCEROS (NO CUBIERTOS RUIDOS NI DEFECTOS EN LA CONSTRUCCION)" "ASISTENCIA PRESENCIAL DE UN ABOGADO EN NOTARIA PARA LA FIRMA DE CONTRATO DE COMPRA O VENTA DE VIVIENDA HABITUAL DE TOMADOR" ...
##  $ prov_inicial_cob: num [1:143930] 30 330 12 0 500 12 12 900 300 300 ...
##  $ prov_cob        : num [1:143930] 0 0 0 0 0 0 0 0 0 0 ...
##  $ pago_total_cob  : num [1:143930] 0 3.54 0 36.3 0 0 0 0 0 0 ...
##  $ coste_total_cob : num [1:143930] 0 3.54 0 36.3 0 0 0 0 0 0 ...
##  $ medio           : chr [1:143930] "EXTRAJUDICIAL" "LTDO PARTICULAR" "EXTRAJUDICIAL" "LTDO RED" ...
##  $ materia         : chr [1:143930] "LABORAL" "CIVIL" "INMUEBLE" "INMUEBLE" ...
summary(LS)
##   siniestro           producto             ramo               tipo          
##  Length:143930      Length:143930      Length:143930      Length:143930     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##   f_ocurrencia        f_declaracion           f_cierre         
##  Min.   :2014-01-01   Min.   :2014-01-07   Min.   :2014-01-07  
##  1st Qu.:2017-02-24   1st Qu.:2017-06-01   1st Qu.:2017-10-25  
##  Median :2019-07-01   Median :2019-09-27   Median :2019-11-14  
##  Mean   :2019-03-03   Mean   :2019-05-21   Mean   :2019-08-05  
##  3rd Qu.:2021-04-27   3rd Qu.:2021-07-06   3rd Qu.:2021-08-25  
##  Max.   :2022-12-30   Max.   :2022-12-30   Max.   :2022-12-31  
##                                            NA's   :14134       
##     estado           cobertura         prov_inicial_cob    prov_cob       
##  Length:143930      Length:143930      Min.   :   0.0   Min.   :    0.00  
##  Class :character   Class :character   1st Qu.:  12.0   1st Qu.:    0.00  
##  Mode  :character   Mode  :character   Median :  38.0   Median :    0.00  
##                                        Mean   : 135.2   Mean   :   22.73  
##                                        3rd Qu.:  85.0   3rd Qu.:    0.00  
##                                        Max.   :5000.0   Max.   :10000.00  
##                                                                           
##  pago_total_cob    coste_total_cob      medio             materia         
##  Min.   : -544.5   Min.   : -544.5   Length:143930      Length:143930     
##  1st Qu.:    0.0   1st Qu.:    0.0   Class :character   Class :character  
##  Median :    0.0   Median :    0.0   Mode  :character   Mode  :character  
##  Mean   :  124.7   Mean   :  147.5                                        
##  3rd Qu.:  104.2   3rd Qu.:  111.6                                        
##  Max.   :10840.3   Max.   :12328.1                                        
## 
head(LS, 10) %>%
  kbl() %>%
  kable_material(c("striped", "hover")) %>%
  scroll_box(width = "100%", height = "350px")
siniestro producto ramo tipo f_ocurrencia f_declaracion f_cierre estado cobertura prov_inicial_cob prov_cob pago_total_cob coste_total_cob medio materia
LS_AS0000000089 CROH DJ RA 2014-02-20 2014-02-25 2014-02-25 TERMINADO CONTRATOS LABORALES: CONFLICTOS INDIVIDUALES DE TRABAJO (SOLO ANTE LA EMPRESA EMPLEADORA) 30 0 0.00 0.00 EXTRAJUDICIAL LABORAL
LS_AS0000000092 CRSCEP DJ RA 2014-03-14 2014-03-20 2014-04-25 TERMINADO RECLAMACION DAÑOS NO CONTRACTUAL MATERIALES 330 0 3.54 3.54 LTDO PARTICULAR CIVIL
LS_AS0000000094 CRMM DJ RA 2014-02-26 2014-04-02 2014-09-09 TERMINADO DCHOS RELATIVOS VIVIENDA: RECLAMACION DAÑOS DE TERCEROS (NO CUBIERTOS RUIDOS NI DEFECTOS EN LA CONSTRUCCION) 12 0 0.00 0.00 EXTRAJUDICIAL INMUEBLE
LS_AS0000000095 SPF DJ SD 2014-04-24 2014-04-28 2014-06-27 TERMINADO ASISTENCIA PRESENCIAL DE UN ABOGADO EN NOTARIA PARA LA FIRMA DE CONTRATO DE COMPRA O VENTA DE VIVIENDA HABITUAL DE TOMADOR 0 0 36.30 36.30 LTDO RED INMUEBLE
LS_AS0000000100 DUMMY DJ SD 2014-02-20 2014-05-23 2014-09-11 TERMINADO RECLAMACION DE DAÑOS CORPORALES 500 0 0.00 0.00 LTDO RED SEGUROS
LS_AS0000000104 CRSCEP DJ RA 2014-04-25 2014-06-09 2014-07-22 TERMINADO DCHOS RELATIVOS VIVIENDA: RECLAMACION DAÑOS DE TERCEROS (NO CUBIERTOS RUIDOS NI DEFECTOS EN LA CONSTRUCCION) 12 0 0.00 0.00 EXTRAJUDICIAL INMUEBLE
LS_AS0000000106 CRSSP DJ RA 2014-07-07 2014-07-25 2015-06-02 TERMINADO DCHOS RELATIVOS VIVIENDA: RECLAMACION DAÑOS DE TERCEROS (NO CUBIERTOS RUIDOS NI DEFECTOS EN LA CONSTRUCCION) 12 0 0.00 0.00 EXTRAJUDICIAL INMUEBLE
LS_AS0000000108 CROH DJ RA 2014-07-08 2014-09-11 2017-02-03 TERMINADO DEFENSA PENAL 900 0 0.00 0.00 LTDO PARTICULAR PENAL
LS_AS0000000109 CROH DJ RA 2014-03-15 2014-09-12 2014-09-12 TERMINADO DEFENSA PENAL 300 0 0.00 0.00 LTDO RED PENAL
LS_AS0000000110 CROH DJ RA 2014-06-07 2014-09-15 2014-09-15 TERMINADO DEFENSA PENAL 300 0 0.00 0.00 LTDO RED PENAL
dim(LS)
## [1] 143930     15


El dataset contiene 143.930 observaciones (correspondientes a siniestros cada una) y 15 variables (de las cuales son 8 cualitativas, 4 cuantitativas y 3 fechas).

A continuación, la descripción de cada una de las variables:

  • siniestro: número identificador del siniestro.

  • producto: producto al que va a asociado el siniestro y que tiene una serie de coberturas y garantías en las cuales no entramos.

  • ramo: ramo asegurador al que se asigna el siniestro. DJ (defensa jurídica) o PP (pérdida pecuniaria)

  • tipo: tipo de seguro en función de la manera en la que se adquiere el riesgo, puede ser adquirido de manera directa a través de la venta directa por la aseguradora (SD - seguro directo) o puede ser un riesgo aceptado si es un riesgo que se adquiere de otra compañía de seguros (RA - reaseguro aceptado).

  • f_ocurrencia: fecha en la que ocurre el siniestro.

  • f_declaracion: fecha en la que el siniestro es comunicado a la compañía de seguros y es abierto.

  • f_cierre: fecha en la que termina el siniestro y es cerrado el expediente.

  • estado: estatus en el que se encuentra el siniestro (abierto, cerrado, reaperturado…)

  • cobertura: nombre y tipo de cobertura siniestrable que aplica en el siniestro y por la que la compañía proporciona una cobertura al asegurado.

  • prov_inicial_cob: provisión con la que se abre el siniestro.

  • prov_cob: provisión actual que tiene el siniestro en el momento del análisis a 31/12/2022.

  • pago_total_cob: cuantía total que se ha pagado hasta el momento (31/12/2022) en el siniestro.

  • coste_total_cob: sumatorio de provision_cobertura_vl + importe_pago_total_cobertura_vl hasta el momento (31/12/2022) en el siniestro.

  • medio: vía mediante la cual se ha proporcionado la cobertura. En este caso, como se tratan de defensa jurídica, es la vía jurídica por la que se ha procedido en el siniestro (acuerdo extrajudicial, juicio con abogado de la red interna o juicio con abogado particular)

  • materia: asunto principal que motiva el siniestro y que motiva el expediente.


2.2 Tratamiento de datos faltantes

No hacemos tratamiento de datos faltantes pues nuestro conocimiento del negocio nos dice que es normal que haya datos faltantes en la variable f_cierre ya que puede haber siniestros en estado abierto.


2.3 División del dataset

Dividimos el dataset en train, test y validation y posteriormente comprobamos que número de observaciones tiene cada una de las partes respecto al dataset total.

set.seed(108)
numero_total = nrow(LS)
# Porcentajes de train, test y validation
w_train = .5
w_test = .25
w_validation = 1 - (w_train + w_test)
# Todos los índices
indices = seq(1:numero_total) 
# Muestreo
indices_train = sample(1:numero_total, numero_total * w_train)
indices_test = sample(indices[-indices_train], numero_total * w_test)
indices_validation = indices[-c(indices_train,indices_test)]
# Agrupamos
LS_train = LS[indices_train,]
LS_test = LS[indices_test,]
LS_validation = LS[indices_validation,]
nrow(LS)
## [1] 143930
nrow(LS_train)
## [1] 71965
nrow(LS_test)
## [1] 35982
nrow(LS_validation)
## [1] 35983



3 Análisis univariante

3.1 Análisis de variables cualitativas


PRODUCTO

merge(setNames(as.data.frame(table(LS_train$producto)), c("producto", "count")),
      setNames(as.data.frame(round(prop.table(table(LS_train$producto))*100, 2)), c("producto", "prop (%)"))
) %>%
  arrange(desc(count)) %>%
  kbl() %>%
  kable_material(c("striped", "hover")) %>%
  scroll_box(width = "100%", height = "350px")
producto count prop (%)
CROH 34046 47.31
CRMM 13463 18.71
CRSPH 6050 8.41
S1PFM 3029 4.21
CRSEP 2764 3.84
CRSSP 1862 2.59
CRGES 1676 2.33
SPFPF 1356 1.88
CRSCEP 1252 1.74
CPPE 667 0.93
CRMMP 570 0.79
SRPF 561 0.78
SBS 509 0.71
CJPL 419 0.58
CRDH 372 0.52
STPF 344 0.48
CRP 330 0.46
CRSPHP 220 0.31
CLDAS 217 0.30
SBSP 205 0.28
SPF 205 0.28
SPFWB 183 0.25
DUMMY 181 0.25
CEJA 166 0.23
ASIS_JUR1 125 0.17
CAEGC 99 0.14
SRDJ 95 0.13
SCP 85 0.12
CRSSEP 60 0.08
CSME 55 0.08
SPFD 53 0.07
TAMPM 51 0.07
SPFWC 47 0.07
S1PFB 45 0.06
SDJ 44 0.06
S1PFWM 43 0.06
SPFWM 40 0.06
CREH 38 0.05
CRGESC 38 0.05
SACYL 36 0.05
SPC 34 0.05
SBSAU 33 0.05
S1PFWC 28 0.04
CRDH1 24 0.03
CPRC1000 22 0.03
SPA 18 0.03
SPFP 18 0.03
CRPN 16 0.02
SDY 15 0.02
STPPM 15 0.02
SBSNE 14 0.02
SIMA 13 0.02
CLDAP 11 0.02
CRPEN 11 0.02
CRPR 10 0.01
CUJP 10 0.01
SPII 9 0.01
S1CFC 5 0.01
CPPM 4 0.01
CROD 4 0.01
CRODAC 4 0.01
SPI 4 0.01
SRASAJ 4 0.01
CRDPC 3 0.00
CRPENA 3 0.00
CSTJ 3 0.00
CRAM 2 0.00
CRASA 2 0.00
CSPVP 2 0.00
SADAD 2 0.00
SCFC 2 0.00
SDK 2 0.00
SRASAC 2 0.00
SRPC 2 0.00
SRPRT1 2 0.00
ASIMA 1 0.00
CEP 1 0.00
CMMP 1 0.00
CPRC300 1 0.00
CRASD 1 0.00
CRDJ 1 0.00
CSCP 1 0.00
CSOPAC 1 0.00
SFC 1 0.00
SRASACS 1 0.00
SRASAM 1 0.00


RAMO

merge(setNames(as.data.frame(table(LS_train$ramo)), c("ramo", "count")),
      setNames(as.data.frame(round(prop.table(table(LS_train$ramo))*100, 2)), c("ramo", "prop (%)"))
) %>%
  arrange(desc(count)) %>%
  kbl() %>%
  kable_material(c("striped", "hover")) %>%
  scroll_box(width = "100%", height = "auto")
ramo count prop (%)
DJ 70448 97.89
PP 1517 2.11


TIPO

merge(setNames(as.data.frame(table(LS_train$tipo)), c("tipo", "count")),
      setNames(as.data.frame(round(prop.table(table(LS_train$tipo))*100, 2)), c("tipo", "prop (%)"))
) %>%
  arrange(desc(count)) %>%
  kbl() %>%
  kable_material(c("striped", "hover")) %>%
  scroll_box(width = "100%", height = "auto")
tipo count prop (%)
RA 62757 87.2
SD 9208 12.8


ESTADO

merge(setNames(as.data.frame(table(LS_train$estado)), c("estado", "count")),
      setNames(as.data.frame(round(prop.table(table(LS_train$estado))*100, 2)), c("estado", "prop (%)"))
) %>%
  arrange(desc(count)) %>%
  kbl() %>%
  kable_material(c("striped", "hover")) %>%
  scroll_box(width = "100%", height = "auto")
estado count prop (%)
TERMINADO 64754 89.98
ACTIVO 6867 9.54
REAPERTURA 284 0.39
ANULADO 60 0.08


COBERTURA

merge(setNames(as.data.frame(table(LS_train$cobertura)), c("cobertura", "count")),
      setNames(as.data.frame(round(prop.table(table(LS_train$cobertura))*100, 2)), c("cobertura", "prop (%)"))
) %>%
  arrange(desc(count)) %>%
  kbl() %>%
  kable_material(c("striped", "hover")) %>%
  scroll_box(width = "100%", height = "350px")
cobertura count prop (%)
DCHOS RELATIVOS VIVIENDA: RECLAMACION DAÑOS DE TERCEROS (NO CUBIERTOS RUIDOS NI DEFECTOS EN LA CONSTRUCCION) 29956 41.63
RECLAMACION DAÑOS NO CONTRACTUAL CORPORALES 8679 12.06
RECLAMACION DAÑOS NO CONTRACTUAL MATERIALES 5032 6.99
DCHOS RELATIVOS VIVIENDA PROPIETARIO: DEFENSA Y RECLAMACION INTERESES FRENTE A LA COMUNIDAD 3713 5.16
DEFENSA PENAL 3252 4.52
CONTRATOS LABORALES: CONFLICTOS INDIVIDUALES DE TRABAJO (SOLO ANTE LA EMPRESA EMPLEADORA) 2897 4.03
RECLAMACION DAÑOS NO CONTRACTUAL VIA ADMINISTRATIVA 2636 3.66
DEFENSA CIVIL COMO DEMANDADO, INCLUIDO MUTUO ACUERDO (EXCEPTO PROC CONCURSALES Y MEDIDAS PATERNO FILIALES) 1698 2.36
DEFENSA PENAL COMO DENUNCIADO ( EXCEPTO SI ALGUNA VICTIMA MENOR DE EDAD) 1190 1.65
DEFENSA CIVIL Y PENAL 1013 1.41
CONTRATOS DE SERVICIOS 698 0.97
PROTECCION DE PAGOS POR DESEMPLEO INVOLUNTARIO 653 0.91
DCHOS RELATIVOS VIVIENDA: RECLAMACION POR INCUMPLIMIENTO DE LOS CONTRATOS DE REPARACION O MANTENIMIENTO DE LAS INSTALACIONES DE LA VIVIENDA 637 0.89
CONTRATOS DE SUMINISTROS DE TELEFONIA Y SIMILARES 611 0.85
DCHOS RELATIVOS VIVIENDA INQUILINO: CONFLICTOS DERIVADOS DEL CONTRATO DE ALQUILER EXCEPTO DESAHUCIO 546 0.76
DCHOS RELATIVOS VIVIENDA PROPIETARIO: JUICIOS DE DESAHUCIO COMO ARRENDADOR 462 0.64
DCHOS RELATIVOS VIVIENDA PROPIETARIO: SERVIDUMBRES DE PASO, LUCES Y SIMILARES 437 0.61
DCHOS RELATIVOS VIVIENDA: RECLAMACION POR INCUMPLIMIENTO DE CONTRATO DE SERVICIOS U OBRAS PRESTADOS EN LA VIVIENDA A LA PROPIA VIVIENDA , AL ASEGURADO O A SUS BIENES 380 0.53
DCHOS RELATIVOS VIVIENDA INQUILINO: CONFLICTOS DERIVADOS DEL CONTRATO DE ALQUILER 357 0.50
RECLAMACIONES POR INCUMPLIMIENTO DE OBLIGACIONES DE PAGO DE RENTAS O PENSIONES EN CASO DE NULIDAD DE MATRIMONIO, SEPARACION O DIVORCIO 343 0.48
CONTRATOS SOBRE COSAS MUEBLES Y OTROS CONTRATOS DE CONSUMO 341 0.47
RECLAMACION OTROS SEGUROS RELATIVOS A LA VIVIENDA 328 0.46
DEFENSA JUDICIAL DE LOS DERECHOS DEL ASEGURADO EN LITIGIOS DERIVADOS DE COMPRAS COMO CONSUMIDOR 324 0.45
DCHOS RELATIVOS VIVIENDA PROPIETARIO: DEFENSA PENAL COMO MIEMBRO JUNTAS COPROPIETARIOS 302 0.42
DEFENSA Y RECLAMACIONES RELACIONADAS CON OTROS SEGUROS 296 0.41
EN RELACION CON EL SERVICIO DOMESTICO 291 0.40
PROTECCION PAGO POR DESEMPLEO 274 0.38
DEFENSA CIVIL COMO DEMANDADO (EXCEPTO PROC CONCURSALES, SEPARACION, DIVORCIO Y MEDIDAS PATERNO FIL MUTUO ACUERDO) 270 0.38
DEFENSA PENAL EN DELITOS DE ROBO, HURTO, APROPIACION INDEBIDA, INJURIAS, CALUMNIAS, AMENAZAS, INSOLVENCIA PUNIBLE, DENUNCIA FALSA Y SIMULACION DE DELITO 265 0.37
SUBSIDIO PARA CURSO DE SENSIBILIZACION Y REEDUCACION VIAL, ASI COMO LAS TASAS DE LA PRUEBA DE CONOCIMIENTO PARA LA RECUPERACION DEL PERMISO O LICENCIA DE CONDUCCION REINTEGRO MAXIMO DE 500€ 230 0.32
DEFENSA LABORAL (SOLO CONFLICTOS INDIVIDUALES FRENTE A EMPRESA) 224 0.31
DEFENSA SANCIONES ADMINISTRATIVAS: EXPEDIENTE DISCIPLINARIO 201 0.28
DEFENSA EN CASO DE SEPARACION Y/O DIVORCIO 192 0.27
DCHOS RELATIVOS VIVIENDA: RECLAMACIONES A VECINOS POR EMANACIONES DE HUMOS O GASES 180 0.25
DEFENSA JUDICIAL DE LOS DERECHOS DEL ASEGURADO EN LITIGIOS DERIVADOS DE COMPRAS FORMALIZADAS POR INTERNET COMO CONSUMIDOR 162 0.23
RECLAMACION DE DAÑOS EN CASO DE ACCIDENTE DERIVADO DE LA CIRCULACION DE VEHICULOS A MOTOR 140 0.19
DEFENSA LABORAL (COMO DEMANDADO Y EMPLEADOR DE PERSONAL DOMESTICO) 134 0.19
DCHOS RELATIVOS VIVIENDA: DEFENSA RESPONSABILIDAD PENAL COMO RESIDENTE 108 0.15
INCUMPLIMIENTOS DE CONTRATOS SOBRE BIENES MUEBLES SITUADOS EN LA VIVIENDA: AJUAR, ELECTRODOMESTICOS, APARATOS DE IMAGEN, SONIDO Y ELECTRONICOS 104 0.14
DCHOS RELATIVOS VIVIENDA INQUILINO: CONFLICTOS DERIVADOS DEL CONTRATO DE ALQUILER (EXCEPTO FALTA DE PAGO) 103 0.14
DCHOS RELATIVOS VIVIENDA: INCUMPLIMIENTO CONTRATO DE COMPRAVENTA 102 0.14
INFORMES PERICIALES 101 0.14
DEFENSA LABORAL: FRENTE A SEG SOCIAL O MUTUA OBTENCION PREST CONTRIBUTIVAS 97 0.13
DEFENSA DE INTERNET 94 0.13
GASTOS PARA LA RECUPERACION DEL PERMISO DE CONDUCCION POR LA PERDIDA TOTAL DE PUNTOS 83 0.12
RECLAMACION DAÑOS CORPORALES 83 0.12
DEFENSA JUDICIAL EN ASUNTOS RELACIONADOS CON EL LOCAL DE NEGOCIO ASEGURADO 79 0.11
DEFENSA PENAL: COMO DENUNCIANTE (AMENAZAS, COACCIONES DELITOS CONTRA LA DIGNIDAD) 78 0.11
SUBSIDIO POR SUSPENSION TEMPORAL EMPLEO Y SUELDO 78 0.11
GASTOS PARA LA RECUPERACION DEL PERMISO DE CONDUCCION POR LA PERDIDA PARCIAL DE PUNTOS 77 0.11
DCHOS RELATIVOS VIVIENDA: OCUPACION ILEGAL DE LA VIVIENDA 74 0.10
RECLAMACION DE DAÑOS CORPORALES 73 0.10
SEPARACION Y DIVORCIO 71 0.10
DEFENSA JUDICIAL DE LOS DERECHOS DEL TOMADOR EN LITIGIOS DERIVADOS DE COMPRAS COMO CONSUMIDOR 70 0.10
RECLAMACION DE DAÑOS CORPORALES EXTRACONTRACTUALES 62 0.09
IMPUGNACION RESOLUCIONES INCAPACIDAD PERMANENTE 55 0.08
RECLAMACION INCUMPLIMIENTO CONTRATOS DE SERVICIOS (PROF TITULADOS, SER, MEDICOS U OTROS) 47 0.07
DCHOS RELATIVOS VIVENDA: INCUMPLIMIENTO CONTRATOS SUMINISTROS VIVIENDA 46 0.06
PROTECCION PAGO POR INCAPACIDAD LABORAL TRANSITORIA 46 0.06
DCHOS RELATIVOS VIVIENDA: DEFECTO OBRA REFORMA 45 0.06
DEFENSA CIVIL COMO DEMANDADO 45 0.06
DEFENSA PENAL EN CASOS DE CONDUCCION SIN PERMISO, HECHOS CONTRA LA SEGURIDAD VIAL, CONDUCCION TEMERARIA Y CONDUCCION BAJO LA INFLUENCIA DE BEBIDAS ALCOHOLICAS 42 0.06
DEFENSA EN INFRACCIONES ADMINISTRATIVAS RELACIONADAS CON LA VIVIENDA 36 0.05
RECLAMACION INCUMPLIMIENTO CONTRATOS DE COMPRAVENTA COSAS MUEBLES 36 0.05
GESTION EXTRAJUDICIAL Y MEDIANTE PROCEDIMIENTO MONITORIO DE CUOTAS IMPAGADAS 35 0.05
RECLAMACIONES EN RELACION CON LA COMPRA DE VIVIENDA 34 0.05
DERECHO FISCAL 31 0.04
GESTION ADMINISTRATIVA DOMESTICA (ALTA, BAJA EMPLEADAS DE HOGAR) 29 0.04
DCHOS RELATIVOS VIVIENDA: RECLAMACION A INQUILINO ACTOS VANDALICOS 26 0.04
DEFENSA PENAL: COMO DENUNCIANTE (DAÑOS PERSONALES Y MATERIALES) 26 0.04
DEFENSA PENAL HECHOS PRODUCIDOS DESEMPEÑO TRABAJO 25 0.03
ASISTENCIA PRESENCIAL DE UN ABOGADO EN CASO DE DETENCION DEL ASEGURADO POR DELITOS CONTRA LA SEGURIDAD VIAL 19 0.03
DEFENSA COMERCIO ELECTRONICO (INCLUMPLIMIENTO DE CONTRATOS DE COMERCIO, CON FACTURA PAGADA) 19 0.03
DEFENSA EN VIA JUDICIAL DE LOS DERECHOS DEL ASEGURADO EN MATERIA DE CONTRATOS LABORALES POR NULIDAD DE DESPIDOS Y OTRAS MEDIDAS DISCIPLINARIAS DISTINTAS DEL DESPIDO 19 0.03
TRAMITES SUCESORIOS (CERTIFICADOS E INSCRIPCIONES) 19 0.03
DEFENSA PENAL POR HECHOS RELACIONADOS CON LA CIRCULACION DE VEHICULOS A MOTOR, EN CASOS DE COMISION POR EL ASEGURADO DE UN DELITO DE: CONDUCCION BAJO LA INFLUENCIA DE BEBIDAS ALCOHOLICAS… 18 0.03
DECLARACION INCAPAZ ASEGURADO 15 0.02
GASTOS POR LA TASA DEL EXAMEN DEL CURSO DE RECUPERACION DEL PERMISO DE CONDUCCION 15 0.02
PROTECCION DE PAGOS POR INCAPACIDAD LABORAL TRANSITORIA 15 0.02
MEDIACION EN CONFLICTOS EN MATERIA CIVIL Y MERCANTIL 14 0.02
DEFENSA PENAL EN CASOS DE CONDUCCION SIN PERMISO, HECHOS CONTRA LA SEGURIDAD VIAL Y CONDUCCION TEMERARIA 13 0.02
ASISTENCIA PRESENCIAL DE UN ABOGADO EN NOTARIA PARA LA FIRMA DE CONTRATO DE COMPRA O VENTA DE VIVIENDA HABITUAL DE TOMADOR 12 0.02
PERDIDAS PECUNIARIAS DERIVADAS DE DELITOS DE ESTAFA SUFRIDOS POR EL ASEGURADO 12 0.02
RECLAMACION AMISTOSA Y JUDICIAL DE DAÑOS MATERIALES 12 0.02
RECLAMACION DAÑOS Y DEFENSA JURIDICA USO ILEGITIMO DE IDENTIDAD (INTERNET, SANCIONES DE TRAFICO, RECLAMACION DEUDA FRAUDULENTA) 12 0.02
SUBSIDIO MENSUAL EN CASO DE REVOCACION DEL PERMISO DE CONDUCCION POR PERDIDA DE PUNTOS 12 0.02
DEFENSA DE LOS DERECHOS DEL ASEGURADO DE SU TRABAJO POR CUENTA AJENA 11 0.02
DEFENSA JUDICIAL PARA LA RECLAMACION DE DAÑOS Y PERJUICIOS CAUSADOS POR PROVEEDORES 10 0.01
REDACCION DE LA DEMANDA DE CONCILIACION SOBRE LOS ASUNTOS EN LOS QUE EL TOMADOR OSTENTE LA CONDICION DE CONSUMIDOR 9 0.01
DEFENSA LABORAL: CONFLICTOS INDIVIDUALES DE TRABAJO DE ASALARIADOS 8 0.01
REDACCION DE LA DEMANDA DE CONCILIACION SOBRE LOS ASUNTOS EN LOS QUE EL TOMADOR OSTENTE LA CONDICION DE ARRENDATARIO 8 0.01
DECLARACION IRPF (CONFECCION Y PRESENTACION) 7 0.01
DEFENSA COMO DEMANDADO POR OBRAS NO AUTORIZADAS 7 0.01
DEFENSA DE IDENTIDAD (EXTRAVIO DEL DNI, ABONO DE GASTOS LEGALES EN CASO DE OCURRENCIA DE FRAUDE DE IDENTIDAD) 7 0.01
RECLAMACION DE DAÑOS PERSONALES 7 0.01
RECLAMACION POR INCUMPLIMIENTO EN MATERIA DE CALIDADES DE LA VIVIENDA 7 0.01
DEFENSA EN CASO DE USURPACION DE VIVIENDA 6 0.01
DEFENSA FISCAL 6 0.01
DEFENSA PENAL EN DELITOS CONTRA EL TRAFICO Y SEGURIDAD VIAL 6 0.01
DEFENSA TRIBUTARIA EN LA LIQUIDACION DE LA SOCIEDAD DE GANANCIALES 6 0.01
ASISTENCIA PRESENCIAL DE UN ABOGADO EN CASO DE DETENCION DEL TOMADOR POR DELITOS CONTRA LA SEGURIDAD VIAL 5 0.01
DEFENSA EN VIA JUDICIAL DE LOS DERECHOS DEL ASEGURADO EN MATERIA DE CONTRATOS DE SUMINISTROS 5 0.01
DEFENSA Y RECLAMACION DEL CONTRATO DE ARRENDAMIENTO 5 0.01
RECLAMACIONES EN RELACION CON LA COMPRA DE VIVIENDA: CALIDADES 5 0.01
RECLAMACIONES POR REPARACIONES DE VEHICULOS AUTOMOVILES EN TALLERES 5 0.01
ASISTENCIA A JUICIO 4 0.01
ASISTENCIA DETENIDO EN COMISARIA 4 0.01
ASISTENCIA JURIDICA DE URGENCIA ASISTENCIA PRESENCIAL DE UN ABOGADO 4 0.01
DEFENSA DE IDENTIDAD 4 0.01
DEFENSA EXTRAJUDICIAL EN MATERIA ADMINISTRATIVA 4 0.01
DEFENSA Y RECLAMACION ADMINISTRATIVA Y JUDICIAL POR ACTAS DE INSPECCION O LIQUIDACION DE LA SEGURIDAD SOCIAL 4 0.01
DEFENSA Y RECLAMACION EN DESAHUCIO POR FALTA DE PAGO Y RESOLUCION DEL CONTRATO POR OBRAS NO CONSENTIDAS 4 0.01
RECLAMACION POR REPARACION DEFECTUOSO DEL VEHICULO 4 0.01
DEFENSA EN VIA JUDICIAL DE LOS DERECHOS DEL ASEGURADO EN MATERIA DE RECLAMACIONES DE CONSUMIDORES 3 0.00
DEFENSA PENAL EN CASOS DE CONDUCCION BAJO LA INFLUENCIA DE BEBIDAS ALCOHOLICAS, CONDUCCION TEMERARIA Y CONDUCCION SIN PERMISO 3 0.00
DEFENSA RESPONSABILIDAD PENAL COMO MIEMBRO JUNTA DE PROPIETARIOS 3 0.00
DEFENSA TRIBUTARIA 3 0.00
ESCUDO ONLINE 3 0.00
INDEMNIZACION POR IMPAGO DE RENTAS DE ALQUILER 3 0.00
INTERVENCION ACTO DE FIRMA NOTARIAL 3 0.00
PERDIDAS PECUNIARIAS DERIVADAS DE DELITOS DE ESTAFA SUFRIDOS POR EL TOMADOR 3 0.00
PROTECCION PAGO POR HOSPITALIZACION ACCIDENTE (30 DIAS CONSECUTIVOS) 3 0.00
RECLAMACION AMISTOSA Y JUDICIAL DE LESIONES Y MUERTE 3 0.00
RECLAMACION DAÑOS Y PERJUICIOS POR DEMANDAS INFUNDADAS 3 0.00
ABOGADO DE CABECERA 2 0.00
ASISTENCIA DE REMOLQUE POR INMOVILIZACION DEL VEHICULO EN SUPUESTOS DE ALCOHOLEMIA 2 0.00
CONTRATOS DE SEGUROS 2 0.00
DEFENSA CIVIL: COMO DEMANDANTE (DAÑOS PERSONALES Y MATERIALES) 2 0.00
DEFENSA DE LA RESPONSABILIDAD PENAL DEL ADMINISTRADOR SOCIETARIO O REPRESENTANTE LEGAL DE LA PERSONA JURIDICA ASEGURADA 2 0.00
DEFENSA EN VIA PENAL POR DELITO CONTRA LA HACIENDA PUBLICA 2 0.00
DEFENSA JUDICIAL POR PERJUICIOS ECONOMICOS EN EL NEGOCIO DEL ASEGURADO DERIVADOS DE OBRAS REALIZADAS A INSTANCIA DEL PROPIETARIO EN EL LOCAL DONDE ESTE INSTALADA LA ACTIVIDAD 2 0.00
DEFENSA PENAL POR DELITOS CONTRA LOS DERECHOS DE LOS TRABAJADORES 2 0.00
DEFENSA PENALY CIVIL SUPLEMENTARIA 2 0.00
DEFENSA Y RECLAMACION COMPRAS CONSUMIDOR 2 0.00
IMPUGNACION DEL VALOR CATASTRAL DE LA VIVIENDA ASEGURADA 2 0.00
PERDIDA PECUNIARIA DERIVADA DELITO DE ESTAFA (CON SENTENCIA CONDENATORIA NO FIRME) 2 0.00
RECLAMACIONES EN RELACION CON LA COMPRA Y USURPACION DE LA VIVIENDA: RETRASO EN ENTREGA Y DIFERENCIA DE CABIDA 2 0.00
RECLAMACIONES RELATIVAS A PENSIONES FRENTE A INSS 2 0.00
REEMBOLSO GASTOS SEPARACION Y DIVORCIO TRAS SENTENCIA/RESOL JUD FIRME 2 0.00
ASISTENCIA PRESENCIAL DE UN ABOGADO EN CASO DE DETENCION POR DELITO CONTRA LA SEGURIDAD VIAL 1 0.00
AYUDA PAGO PENSION ALIMENTOS 1 0.00
COMPRA FRAUDULENTA 1 0.00
COMPRA PROTEGIDA CONTRA ROBO/HURTO 1 0.00
DEFENSA (VARIOS) 1 0.00
DEFENSA CIVIL: COMO DEMANDADO ACTOS RELACIONADOS CON SU ACTIVIDAD (EXCEPTO POR RC) 1 0.00
DEFENSA COMO DEMANDANTE EN CASO DE INCUMPLIMIENTO DE CONTRATOS DE SERVICIOS 1 0.00
DEFENSA EN INFRACCIONES ADMINISTRATIVAS 1 0.00
DEFENSA EN VIA JUDICIAL DE LOS DERECHOS DE LA ENTIDAD ASEGURADA EN MATERIA DE RECLAMACIONES DE CONSUMIDORES 1 0.00
DEFENSA JUDICIAL EN MATERIA DE CONTRATOS DE SERVICIOS 1 0.00
DEFENSA JUDICIAL PARA LA RECLAMACION DE DAÑOS CORPPRALES CAUSADOS POR AGRESIONES A LOS EMPLEADOS 1 0.00
DEFENSA JURIDICA EN EL EXTRANJERO Y DEFENSA JURIDICA DEL ESTUDIANTE 1 0.00
DEFENSA PENAL DEL ASEGURADO POR DELITO FISCAL 1 0.00
DEFENSA PENAL EN CASO DE CONDUCCION BAJO LA INFLUENCIA DE BEBIDAS ALCOHOLICAS 1 0.00
DERECHOS RELATIVOS AL LOCAL DE NEGOCIO: CONFLICTOS DERIVADOS DEL ALQUILER (EXCEPTO POR FALTA DE PAGO DE LA RENTA) 1 0.00
DERECHOS RELATIVOS AL LOCAL DE NEGOCIO: RECLAMACION DAÑOS DE ORIGEN EXTRACONTRACTUAL 1 0.00
DJ-PERITO DAÑOS MATERIALES 1 0.00
DJ-RECLAMACION DAÑOS NO CONTRACTUAL CORPORALES 1 0.00
INDEMNIZACION POR DAÑOS PRODUCIDOS POR ACTOS VANDALICOS 1 0.00
RECLAMACION DAÑOS CORPORALES HECHOS PRODUCIDOS DESEMPEÑO TRABAJO 1 0.00
RECLAMACION DAÑOS INTERNET POR AMENAZAS, ACOSO, CALUMNIAS, ETC 1 0.00
RECLAMACION MENOR ACOSO ESCOLAR 1 0.00
RECLAMACION OTROS SEGUROS TOMADOR 1 0.00
RECLAMACION POR DIFERENCIA DE CABIDA DE LA VIVIENDA 1 0.00
RECLAMACION POR RETRASO DE ENTREGA DE LA VIVIENDA 1 0.00
RECLAMACIONES PRESTACIONES SOCIALES FRENTE A INSS 1 0.00
RECLAMACON DAÑOS Y PERJUICIOS POR DEMANDAS INFUNDADAS 1 0.00
SUSTRACCION ILEGITIMA 1 0.00
SUSTRACCION ILEGITIMA: RETIRADA DE EFECTIVO EN CAJERO 1 0.00


MEDIO

merge(setNames(as.data.frame(table(LS_train$medio)), c("medio", "count")),
      setNames(as.data.frame(round(prop.table(table(LS_train$medio))*100, 2)), c("medio", "prop (%)"))
) %>%
  arrange(desc(count)) %>%
  kbl() %>%
  kable_material(c("striped", "hover")) %>%
  scroll_box(width = "100%", height = "auto")
medio count prop (%)
EXTRAJUDICIAL 52225 72.57
LTDO RED 10510 14.60
LTDO PARTICULAR 9230 12.83


MATERIA

merge(setNames(as.data.frame(table(LS_train$materia)), c("materia", "count")),
      setNames(as.data.frame(round(prop.table(table(LS_train$materia))*100, 2)), c("materia", "prop (%)"))
) %>%
  arrange(desc(count)) %>%
  kbl() %>%
  kable_material(c("striped", "hover")) %>%
  scroll_box(width = "100%", height = "350px")
materia count prop (%)
INMUEBLE 36085 50.14
SEGUROS 9438 13.11
PENAL 7507 10.43
CIVIL 6476 9.00
LABORAL 3778 5.25
CONSUMO 3352 4.66
ADMINISTRATIVO 3075 4.27
DEF.JCA.GES 1673 2.32
MULTAS 401 0.56
INTERNET 95 0.13
FISCAL 85 0.12


# PLOT PRODUCTO
# Paso 1: Sumarizar y ordenar los datos
LS_train_primeros15 <- LS_train %>%
  group_by(producto) %>%
  summarize(count = n()) %>%
  arrange(-count) %>%
  slice(1:15) # Paso 2: Limitar a los 15 productos más frecuentes

# Paso 2: Gráfico
plot_producto <- ggplot(LS_train_primeros15, aes(x = reorder(producto, count), y = count)) + 
                    geom_bar(stat = "identity", fill = "#009494") +
                    coord_flip() +
                    labs(x = "producto", y = "Nº producto", title = "Producto") +
                    theme(plot.title = element_text(hjust = 0.5))
                    
                    

# PLOT RAMO                    
plot_ramo <- ggplot(LS_train, aes(ramo)) +
                geom_bar(fill = "#009494") +
                labs(x = "ramo", y = "Nº ramo", title = "Ramo") +
                theme(plot.title = element_text(hjust = 0.5))



# PLOT TIPO
plot_tipo <- ggplot(LS_train, aes(tipo)) +
                geom_bar(fill = "#009494") +
                labs(x = "tipo", y = "Nº tipo", title = "Tipo") +
                theme(plot.title = element_text(hjust = 0.5))



# PLOT ESTADO
# Paso 1: Calcular el número de ocurrencias para cada 'estado'
estado_counts <- LS_train %>% 
  group_by(estado) %>% 
  summarise(n = n()) %>% 
  arrange(-n)

# Paso 2: Usar esa información para reordenar la variable 'estado' en el dataframe
LS_train$estado <- factor(LS_train$estado, levels = estado_counts$estado)

# Paso 3: Crear el gráfico
plot_estado <- ggplot(LS_train, aes(estado)) +
                  geom_bar(fill = "#009494") +
                  labs(x = "estado", y = "Nº estado", title = "Estado") +
                  theme(plot.title = element_text(hjust = 0.5), 
                        axis.text.x = element_text(angle = 15, hjust = 1))
                  


# PLOT MEDIO
# Paso 1: Calcular el número de ocurrencias para cada 'medio'
medio_counts <- LS_train %>% 
  group_by(medio) %>% 
  summarise(n = n()) %>% 
  arrange(-n)

# Paso 2: Usar esa información para reordenar la variable 'medio' en el dataframe
LS_train$medio <- factor(LS_train$medio, levels = medio_counts$medio)

# Paso 3: Crear el gráfico
plot_medio <- ggplot(LS_train, aes(medio)) +
                 geom_bar(fill = "#009494") +
                 labs(x = "medio", y = "Nº medio", title = "Medio") +
                 theme(plot.title = element_text(hjust = 0.5), 
                       axis.text.x = element_text(angle = 15, hjust = 1))
                 
                 

# PLOT MATERIA                 
# Paso 1: Calcular el número de ocurrencias para cada 'materia'
materia_counts <- LS_train %>% 
  group_by(materia) %>% 
  summarise(n = n()) %>% 
  arrange(n)

# Paso 2: Usar esa información para reordenar la variable 'materia' en el dataframe
LS_train$materia <- factor(LS_train$materia, levels = materia_counts$materia)

# Paso 3: Crear el gráfico
plot_materia <- ggplot(LS_train, aes(x = materia)) +
                   geom_bar(fill = "#009494") +
                   coord_flip() + 
                   labs(x = "materia", y = "Nº materia", title = "Materia") +
                   theme(plot.title = element_text(hjust = 0.5))             
grid.arrange(plot_producto,
             plot_materia,
             ncol=2)


Para la variable producto sólo representamos los 15 primeros ya que a partir de ahí son muchos los productos pero pocos los siniestros por producto. Se observa como un producto destaca ampliamente sobre el resto, en torno al 47% de los siniestros de esta compañía son del producto CROH.

En cuanto a la materia, destaca ampliamente todo lo que tiene que ver con inmuebles, el 50% de los siniestros.

grid.arrange(plot_ramo, 
             plot_tipo,
             ncol=2)

Casi el 98% de los siniestros son del ramo de Defensa Jurídica, ramo CORE de LS Insurance y tan sólo el 2% de Pérdidas Pecuniarias.

Algo parecido sudece con el tipo de seguro ya que el 87% son de RA (reaseguro aceptado) y sólo un 13% aproximadamente de SD (seguro Directo). Esto nos indica que la mayor parte de la siniestralidad de la compañía procede de la aceptación de riesgo de otras compañías aseguradoras y no del riesgo que vende LS de manera directa.

grid.arrange(plot_estado, 
             plot_medio, 
             ncol=2)

El 90% de los siniestros están terminados y a priori no se van a producir cambios en ellos por lo que los datos finales de estos contituyen de manera bastante fiel la realidad de la siniestralidad de la compañía y nos facilitará en gran medida la tarea de clasificar y predecir costes de siniestros.

Por otro lado es relevante apreciar que en al rededor de un 72% de los siniestros terminan siendo gestionados de manera extrajudicial, un 15% en juicios llevados por letrados de la red propia de LS Insurance y un 13% acaban en manos de abogados externos que comunmente provocan un incremento en el coste del siniestro ya que no son llevados por personal interno.


*No se realiza gráfico de la variable cobertura por cuestión estética debido a la gran cantidad de coberturas existentes, casi 200 distintas, y porque no tiene mucho sentido ya que entre ellas las diferencias son excasas


3.2 Análisis de variables temporales


# Extraer el año y convertirlo en una variable categórica
LS_train <- LS_train %>%
  mutate(year_ocurrencia = as.factor(lubridate::year(f_ocurrencia)),
         year_declaracion = as.factor(lubridate::year(f_declaracion)),
         year_cierre = as.factor(lubridate::year(f_cierre)))

FECHA OCURRENCIA

tabla_ocurrencia <- LS_train %>%
  group_by(year_ocurrencia) %>%
  summarise(count = n()) %>%
  mutate(prop = round((count / sum(count)) * 100, 2)) %>%
  arrange(desc(count))

tabla_ocurrencia %>%
  kbl(col.names = c("year", "count", "prop (%)")) %>%
  kable_material(c("striped", "hover")) %>%
  scroll_box(width = "100%", height = "350px")
year count prop (%)
2021 11336 15.75
2022 10424 14.48
2020 9786 13.60
2019 8786 12.21
2018 8213 11.41
2017 6611 9.19
2016 6466 8.98
2015 5625 7.82
2014 4718 6.56
# PLOT AÑO OCURRENCIA
plot_year_ocurrencia <- ggplot(LS_train, aes(x = year_ocurrencia)) +
  geom_line(stat = 'count', aes(group = 1), color = "#009494") +
  labs(x = "Año de ocurrencia", y = "Nº de siniestros", title = "Siniestros por año de ocurrencia") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))


FECHA DECLARACIÓN

tabla_declaracion <- LS_train %>%
  group_by(year_declaracion) %>%
  summarise(count = n()) %>%
  mutate(prop = round((count / sum(count)) * 100, 2)) %>%
  arrange(desc(count))

tabla_declaracion %>%
  kbl(col.names = c("year", "count", "prop (%)")) %>%
  kable_material(c("striped", "hover")) %>%
  scroll_box(width = "100%", height = "350px")
year count prop (%)
2022 12422 17.26
2021 11910 16.55
2020 9444 13.12
2019 8743 12.15
2018 7935 11.03
2017 6425 8.93
2016 6157 8.56
2015 5307 7.37
2014 3622 5.03
# PLOT AÑO DECLARACIÓN
plot_year_declaracion <- ggplot(LS_train, aes(x = year_declaracion)) +
  geom_line(stat = 'count', aes(group = 1), color = "#009494") +
  labs(x = "Año de declaración", y = "Nº de siniestros", title = "Siniestros por año de declaración") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))


FECHA CIERRE

tabla_cierre <- LS_train %>%
  group_by(year_cierre) %>%
  summarise(count = n()) %>%
  mutate(prop = round((count / sum(count)) * 100, 2)) %>%
  arrange(desc(count))

tabla_cierre %>%
  kbl(col.names = c("year", "count", "prop (%)")) %>%
  kable_material(c("striped", "hover")) %>%
  scroll_box(width = "100%", height = "350px")
year count prop (%)
2022 11905 16.54
2021 11123 15.46
2019 9101 12.65
2020 8383 11.65
NA 7151 9.94
2018 6885 9.57
2017 6139 8.53
2016 5234 7.27
2015 3921 5.45
2014 2123 2.95
# PLOT AÑO CIERRE
plot_year_cierre <- ggplot(LS_train, aes(x = year_cierre)) +
  geom_line(stat = 'count', aes(group = 1), color = "#009494") +
  labs(x = "Año de cierre", y = "Nº de siniestros", title = "Siniestros por año de cierre") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))


# GRÁFICOS JUNTOS POR AÑO
# Primero hay que modificar el dataframe para que las fechas estén en una sola columna y tener otra columna que identifique el tipo de fecha
LS_train_long <- LS_train %>%
  select(siniestro, year_ocurrencia, year_declaracion, year_cierre) %>%
  gather(key = "Tipo de Fecha", value = "Año", -siniestro)

plot_fechas_año <- ggplot(LS_train_long, aes(x = Año, group = `Tipo de Fecha`)) +
  geom_line(stat = 'count', aes(color = `Tipo de Fecha`)) +
  labs(x = "Año", y = "Nº de siniestros", title = "Siniestros por año según tipo de fecha") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)) +
  scale_color_manual(values = c("year_ocurrencia" = "blue", "year_declaracion" = "green", "year_cierre" = "red"),
                     name = "Tipo de Fecha")

print(plot_fechas_año)

Podemos observar la tendencia de que año tras año el número de siniestros que ocurren y son declaran por parte de los asegurados es creciente y con una pendiente bastante acentuada.

Esto puede ser por varios motivos pero uno de los principales en este negocio es el crecimiento de la cartera y la asunción de nuevos riesgo con el correspondiente crecimiento de las primas devengadas anuales. Este hecho no lo podemos comprobar ya que el dataset carece de datos relativos a primas, no obstante, nuestro conocimiento del negocio nos hace pensar que es así.

Importante a tener en cuenta es que los crecimientos de cartera y en número de siniestros no siempre son proporcionales, no todas las carteras (productos) tienen los mismo comportamientos y en el estudio de la rentabilidad de las mismas hay que tener en cuenta la rentabilidad o el ratio de siniestralidad de las mismas.

# PLOT MES OCURRENCIA
LS_train$mes_ocurrencia <- lubridate::month(LS_train$f_ocurrencia, label = TRUE)

plot_mes_ocurrencia <- ggplot(LS_train, aes(mes_ocurrencia)) + 
  geom_bar(fill = "#009494") +
  labs(x = "Mes de ocurrencia", y = "Nº de siniestros", title = "Distribución de siniestros ocurridos por mes") +
  theme(plot.title = element_text(hjust = 0.5))



# PLOT MES DECLARACIÓN
LS_train$mes_declaracion <- lubridate::month(LS_train$f_declaracion, label = TRUE)

plot_mes_declaracion <- ggplot(LS_train, aes(mes_declaracion)) + 
  geom_bar(fill = "#009494") +
  labs(x = "Mes de declaración", y = "Nº de siniestros", title = "Distribución de siniestros declarados por mes") +
  theme(plot.title = element_text(hjust = 0.5))



# PLOT MES CIERRE
LS_train$mes_cierre <- lubridate::month(LS_train$f_cierre, label = TRUE)

plot_mes_cierre <- ggplot(LS_train, aes(mes_cierre)) + 
  geom_bar(fill = "#009494") +
  labs(x = "Mes de cierre", y = "Nº de siniestros", title = "Distribución de siniestros cerrados por mes") +
  theme(plot.title = element_text(hjust = 0.5))
plot_mes_ocurrencia

plot_mes_declaracion

plot_mes_cierre

Respecto al número de siniestros ocurridos por mes hay una distribución más o menos homogénea pero se aprecia que hay menor número de siniestros en los meses donde hay mayores festividades, abril y diciembre, así como agosto por el periodo vacacional de verano.

Esto se acentúa en los momentos de declarar siniestros por parte de los asegurados que normalmente esperan unos días en comunicarlos en caso de encontrarse en periodos estivales. Y pasa lo mismo en lo que respecta al cierre de siniestros por parte de los tramitadores de LS Insurance.

Intuímos un cierto patrón; los meses sin fiestas sube el número de siniestros ocurridos, declarados y cerrados mientras que por el contrario los meses con fiestas este número de siniestros baja.

LS_train$dias_para_declarar <- as.numeric(difftime(LS_train$f_declaracion, LS_train$f_ocurrencia, units = "days"))
LS_train$dias_para_cerrar <- as.numeric(difftime(LS_train$f_cierre, LS_train$f_declaracion, units = "days"))

# Histograma con línea de densidad para días para declarar
plot_dias_para_declarar <- ggplot(LS_train, aes(x = dias_para_declarar)) +
  geom_histogram(aes(y = ..density..), fill = "#009494", bins = 50, alpha = 0.7) +
  geom_density(color = "green", size = 1.2) +
  labs(x = "Días para declarar", y = "Densidad", title = "Distribución de días para declarar") +
  theme(plot.title = element_text(hjust = 0.5))

# Histograma con línea de densidad para días para cerrar
plot_dias_para_cerrar <- ggplot(LS_train, aes(x = dias_para_cerrar)) +
  geom_histogram(aes(y = ..density..), fill = "#009494", bins = 50, alpha = 0.7) +
  geom_density(color = "red", size = 1.2) +
  labs(x = "Días para cerrar", y = "Densidad", title = "Distribución de días para cerrar") +
  theme(plot.title = element_text(hjust = 0.5))

# Para visualizar los gráficos, simplemente ejecuta sus nombres:
grid.arrange(plot_dias_para_declarar, 
             plot_dias_para_cerrar, 
             ncol=2)

# Porcentaje de siniestros declarados antes de 90 días
porcentaje_declara_antes_90 <- mean(LS_train$dias_para_declarar < 90) * 100
porcentaje_declara_antes_365 <- mean(LS_train$dias_para_declarar < 365) * 100

# Porcentaje de siniestros cerrados antes de 90 días (excluyendo los NA)
porcentaje_cierra_antes_90 <- mean(LS_train$dias_para_cerrar < 90, na.rm = TRUE) * 100
porcentaje_cierra_antes_365 <- mean(LS_train$dias_para_cerrar < 365, na.rm = TRUE) * 100

cat(paste0("% de siniestros declarados antes de 90 días: ", round(porcentaje_declara_antes_90, 2), "%\n"))
## % de siniestros declarados antes de 90 días: 77.37%
cat(paste0("% de siniestros declarados antes de 365 días: ", round(porcentaje_declara_antes_365, 2), "%\n"))
## % de siniestros declarados antes de 365 días: 94.82%
cat(paste0("% de siniestros cerrados antes de 90 días: ", round(porcentaje_cierra_antes_90, 2), "%\n"))
## % de siniestros cerrados antes de 90 días: 52.08%
cat(paste0("% de siniestros cerrados antes de 365 días: ", round(porcentaje_cierra_antes_365, 2), "%\n"))
## % de siniestros cerrados antes de 365 días: 84.75%

Aunque el 77% de los siniestros se declara en los primeros 3 meses, exite un alto porcentaje de que el asegurado se demore en la comunicación de los mismos llegando a veces a tardar más de 1 año, lo cual es bastante malo para el negocio ya que afecta negativamente incrementando las reservas de la compañía en lo que se conoce como provisión de siniestros pendinetes de declaración (PSPD/IBNR), es decir reservar un dinero para siniestro que no están comunicados pero que la compañía tiene que preveer que se comunicarán y estimar el coste de los mismos.

Con el segundo gráfico pretendía demostrar que este tipo de siniestros son de cola larga superando en un alto porcentaje el año en las gestiones de tramitación. Esto se debe principalmente al ramo que comercializa LS Insurance ya que al tratarse de defensa y asesoramiento jurídico se demora bastante los pacto extrajudiciales por no hablar de los que acaban en tela de juicio que todavía se demoran más.

# PLOT HEATMAP MES OCURRENCIA
ocurrencia_counts <- LS_train %>%
  group_by(year = year(f_ocurrencia), month = month(f_ocurrencia, label = TRUE)) %>%
  summarise(count = n())

plot_heatmap_ocurrencia <- ggplot(ocurrencia_counts, aes(y = month, x = factor(year), fill = count)) + 
                              geom_tile() + 
                              labs(title = "Siniestros por Fecha de Ocurrencia", y = "Mes", x = "Año") +
                              scale_fill_gradient(low = "white", high = "red") +
                              theme(plot.title = element_text(hjust = 0.5),
                                    axis.text.x = element_text(angle = 35, hjust = 1))



# PLOT HEATMAP MES DECLARACIÓN
declaración_counts <- LS_train %>%
  group_by(year = year(f_declaracion), month = month(f_declaracion, label = TRUE)) %>%
  summarise(count = n())

plot_heatmap_declaración <- ggplot(declaración_counts, aes(y = month, x = factor(year), fill = count)) + 
                              geom_tile() + 
                              labs(title = "Siniestros por Fecha de Declaración", y = "Mes", x = "Año") +
                              scale_fill_gradient(low = "white", high = "red") +
                              theme(plot.title = element_text(hjust = 0.5),
                                    axis.text.x = element_text(angle = 35, hjust = 1))



# PLOT HEATMAP MES CIERRE
cierre_counts <- LS_train %>%
  group_by(year = year(f_cierre), month = month(f_cierre, label = TRUE)) %>%
  summarise(count = n())

plot_heatmap_cierre <- ggplot(cierre_counts, aes(y = month, x = factor(year), fill = count)) + 
                              geom_tile() + 
                              labs(title = "Siniestros por Fecha de Cierre", y = "Mes", x = "Año") +
                              scale_fill_gradient(low = "white", high = "red") +
                              theme(plot.title = element_text(hjust = 0.5),
                                    axis.text.x = element_text(angle = 35, hjust = 1))
grid.arrange(plot_heatmap_ocurrencia,
             plot_heatmap_declaración,
             ncol=2)

Los heatmaps anteriores continúan demostrando como conforme han ido pasando los años hay un creciente número de siniestros ocurridos y comunicados así como la confirmación del patrón que mencionábamos con anterioridad sobre las diferencias entre meses con festividades y meses sin ellas.


*No se realiza gráfico heatmap de la variable f_cierre porque su visualización no aporta gran información sobre los años y meses que más siniestros se cierran ya que hay un alto porcentaje de siniestros que continúan abiertos.


3.3 Análisis de variables cuantitativas


PROVISIÓN INICIAL COBERTURA

# Estadísticas descriptivas para prov_inicial_cob
stats_prov_inicial <- LS_train %>%
  summarize(
    Minimo = round(min(prov_inicial_cob, na.rm = TRUE), 2),
    Maximo = round(max(prov_inicial_cob, na.rm = TRUE), 2),
    Mediana = round(median(prov_inicial_cob, na.rm = TRUE), 2),
    Media = round(mean(prov_inicial_cob, na.rm = TRUE), 2),
    Desviacion_Estandar = round(sd(prov_inicial_cob, na.rm = TRUE), 2),
    Varianza = round(var(prov_inicial_cob, na.rm = TRUE), 2),
    Q1 = round(quantile(prov_inicial_cob, 0.25, na.rm = TRUE), 2),
    Q3 = round(quantile(prov_inicial_cob, 0.75, na.rm = TRUE), 2)
  ) %>%
  mutate(
    Rango = round(Maximo - Minimo, 2),
    Rango_Intercuartilico = round(Q3 - Q1, 2)
  ) %>%
  gather("Estadístico", "Valor")

# Estadísticas descriptivas para prov_inicial_cob excluyendo 0.00
stats_prov_inicial_sin_ceros <- LS_train %>%
  filter(prov_inicial_cob != 0.00) %>%
  summarize(
    Minimo = round(min(prov_inicial_cob, na.rm = TRUE), 2),
    Maximo = round(max(prov_inicial_cob, na.rm = TRUE), 2),
    Mediana = round(median(prov_inicial_cob, na.rm = TRUE), 2),
    Media = round(mean(prov_inicial_cob, na.rm = TRUE), 2),
    Desviacion_Estandar = round(sd(prov_inicial_cob, na.rm = TRUE), 2),
    Varianza = round(var(prov_inicial_cob, na.rm = TRUE), 2),
    Q1 = round(quantile(prov_inicial_cob, 0.25, na.rm = TRUE), 2),
    Q3 = round(quantile(prov_inicial_cob, 0.75, na.rm = TRUE), 2)
  ) %>%
  mutate(
    Rango = round(Maximo - Minimo, 2),
    Rango_Intercuartilico = round(Q3 - Q1, 2)
  ) %>%
  gather("Estadístico", "Valor_sin_ceros")

# Agregamos la moda como una fila adicional con 0.00 y sin 0.00
mode_value <- as.numeric(names(sort(table(LS_train$prov_inicial_cob), decreasing = TRUE)[1]))
stats_prov_inicial <- rbind(stats_prov_inicial, data.frame(Estadístico = "Moda", Valor = round(mode_value, 2)))

mode_value_sin_ceros <- as.numeric(names(sort(table(filter(LS_train, prov_inicial_cob != 0.00)$prov_inicial_cob), decreasing = TRUE)[1]))
stats_prov_inicial_sin_ceros <- rbind(stats_prov_inicial_sin_ceros, data.frame(Estadístico = "Moda", Valor_sin_ceros = round(mode_value_sin_ceros, 2)))

# Fusionamos las dos tablas
stats_prov_inicial <- left_join(stats_prov_inicial, stats_prov_inicial_sin_ceros, by = "Estadístico")

# Convertir la tabla a kbl
tabla_prov_inicial <- kbl(stats_prov_inicial, align = c("c", "c", "c"), col.names = c("Estadístico", "Valor", "Valor sin 0.00")) %>%
  kable_material()

tabla_prov_inicial
Estadístico Valor Valor sin 0.00
Minimo 0.00 1.12
Maximo 5000.00 5000.00
Mediana 38.00 38.00
Media 135.88 136.33
Desviacion_Estandar 266.36 266.69
Varianza 70949.53 71124.95
Q1 12.00 12.00
Q3 85.00 85.00
Rango 5000.00 4998.88
Rango_Intercuartilico 73.00 73.00
Moda 12.00 12.00
# PLOT HISTOGRAMA PROVISIÓN INICIAL COBERTURA
plot_hist_dens_prov_inicial <- ggplot(LS_train, aes(x=prov_inicial_cob)) +
                                  geom_histogram(aes(y=..density..), fill="#009494", bins=20) +
                                  geom_density(alpha=0.2, color="#D55E00") + 
                                  labs(title="Hist. y Dens. prov_inicial_cob", y="Densidad") +
                                  theme(plot.title = element_text(hjust = 0.5))



# PLOT BOXPLOT PROVISIÓN INICIAL COBERTURA
plot_boxplot_prov_inicial <- ggplot(LS_train, aes(y=prov_inicial_cob)) +
                                geom_boxplot(fill="#009494", outlier.color="#D55E00", outlier.shape=16, outlier.size=2) +
                                labs(title="Boxplot prov_inicial_cob") +
                                theme(plot.title = element_text(hjust = 0.5))



# PLOT SCATTERPLOT PROVISIÓN INICIAL COBERTURA
plot_geomplot_prov_inicial <- ggplot(LS_train, aes(x=seq_along(prov_inicial_cob), y=prov_inicial_cob)) +
                                 geom_point(color="#009494", alpha=0.4) +
                                 labs(title="Scatter Plot prov_inicial_cob", x="Índice", y="Valor") +
                                 theme(plot.title = element_text(hjust = 0.5))



# PLOT QQPLOT PROVISIÓN INICIAL COBERTURA
plot_qqplot_prov_inicial <- ggplot(LS_train, aes(sample=prov_inicial_cob)) +
                               stat_qq(distribution=stats::qnorm, dparams=list(mean=mean(LS_train$prov_inicial_cob, na.rm=TRUE), sd=sd(LS_train$prov_inicial_cob, na.rm=TRUE))) +
                               geom_abline(intercept=0, slope=1, color="#D55E00") +
                               labs(title="Q-Q Plot prov_inicial_cob") +
                               theme(plot.title = element_text(hjust = 0.5))



# Filtrar el dataset para excluir los valores de 0.00
LS_train_filtered_0.00 <- LS_train %>% filter(prov_inicial_cob != 0.00)

# PLOT HISTOGRAMA PROVISIÓN INICIAL COBERTURA SIN 0.00
plot_hist_dens_prov_inicial_filtered_0.00 <- ggplot(LS_train_filtered_0.00, aes(x=prov_inicial_cob)) +
                                                geom_histogram(aes(y=..density..), fill="#009494", bins=20) +
                                                geom_density(alpha=0.2, color="#D55E00") + 
                                                labs(title="Hist. y Dens. prov_inicial_cob <> 0.00", y="Densidad") +
                                                theme(plot.title = element_text(hjust = 0.5))



# PLOT BOXPLOT PROVISIÓN INICIAL COBERTURA SIN 0.00
plot_boxplot_prov_inicial_filtered_0.00 <- ggplot(LS_train_filtered_0.00, aes(y=prov_inicial_cob)) +
                                              geom_boxplot(fill="#009494", outlier.color="#D55E00", outlier.shape=16, outlier.size=2) +
                                              labs(title="Boxplot prov_inicial_cob <> 0.00") +
                                              theme(plot.title = element_text(hjust = 0.5))



# PLOT SCATTERPLOT PROVISIÓN INICIAL COBERTURA SIN 0.00
plot_geomplot_prov_inicial_filtered_0.00 <- ggplot(LS_train_filtered_0.00, aes(x=seq_along(prov_inicial_cob), y=prov_inicial_cob)) +
                                               geom_point(color="#009494", alpha=0.4) +
                                               labs(title="Scatter Plot prov_inicial_cob <> 0.00", x="Índice", y="Valor") +
                                               theme(plot.title = element_text(hjust = 0.5))



# PLOT QQPLOT PROVISIÓN INICIAL COBERTURA SIN 0.00
plot_qqplot_prov_inicial_filtered_0.00 <- ggplot(LS_train_filtered_0.00, aes(sample=prov_inicial_cob)) +
                                             stat_qq(distribution=stats::qnorm, dparams=list(mean=mean(LS_train_filtered_0.00$prov_inicial_cob, na.rm=TRUE), sd=sd(LS_train_filtered_0.00$prov_inicial_cob, na.rm=TRUE))) +
                                             geom_abline(intercept=0, slope=1, color="#D55E00") +
                                             labs(title="Q-Q Plot prov_inicial_cob <> 0.00") +
                                             theme(plot.title = element_text(hjust = 0.5))
grid.arrange(plot_hist_dens_prov_inicial,
             plot_hist_dens_prov_inicial_filtered_0.00,
             ncol=2)

grid.arrange(plot_boxplot_prov_inicial,
             plot_boxplot_prov_inicial_filtered_0.00,
             ncol=2)

grid.arrange(plot_geomplot_prov_inicial,
             plot_geomplot_prov_inicial_filtered_0.00,
             ncol=2)

grid.arrange(plot_qqplot_prov_inicial,
             plot_qqplot_prov_inicial_filtered_0.00,
             ncol=2)


PROVISIÓN COBERTURA

# Estadísticas descriptivas para prov_cob
stats_prov_cob <- LS_train %>%
  summarize(
    Minimo = round(min(prov_cob, na.rm = TRUE), 2),
    Maximo = round(max(prov_cob, na.rm = TRUE), 2),
    Mediana = round(median(prov_cob, na.rm = TRUE), 2),
    Media = round(mean(prov_cob, na.rm = TRUE), 2),
    Desviacion_Estandar = round(sd(prov_cob, na.rm = TRUE), 2),
    Varianza = round(var(prov_cob, na.rm = TRUE), 2),
    Q1 = round(quantile(prov_cob, 0.25, na.rm = TRUE), 2),
    Q3 = round(quantile(prov_cob, 0.75, na.rm = TRUE), 2)
  ) %>%
  mutate(
    Rango = round(Maximo - Minimo, 2),
    Rango_Intercuartilico = round(Q3 - Q1, 2)
  ) %>%
  gather("Estadístico", "Valor")

# Estadísticas descriptivas para prov_cob excluyendo 0.00
stats_prov_cob_sin_ceros <- LS_train %>%
  filter(prov_cob != 0.00) %>%
  summarize(
    Minimo = round(min(prov_cob, na.rm = TRUE), 2),
    Maximo = round(max(prov_cob, na.rm = TRUE), 2),
    Mediana = round(median(prov_cob, na.rm = TRUE), 2),
    Media = round(mean(prov_cob, na.rm = TRUE), 2),
    Desviacion_Estandar = round(sd(prov_cob, na.rm = TRUE), 2),
    Varianza = round(var(prov_cob, na.rm = TRUE), 2),
    Q1 = round(quantile(prov_cob, 0.25, na.rm = TRUE), 2),
    Q3 = round(quantile(prov_cob, 0.75, na.rm = TRUE), 2)
  ) %>%
  mutate(
    Rango = round(Maximo - Minimo, 2),
    Rango_Intercuartilico = round(Q3 - Q1, 2)
  ) %>%
  gather("Estadístico", "Valor_sin_ceros")

# Agregamos la moda como una fila adicional con 0.00 y sin 0.00
mode_value_prov_cob <- as.numeric(names(sort(table(LS_train$prov_cob), decreasing = TRUE)[1]))
stats_prov_cob <- rbind(stats_prov_cob, data.frame(Estadístico = "Moda", Valor = round(mode_value_prov_cob, 2)))

mode_value_prov_cob_sin_ceros <- as.numeric(names(sort(table(filter(LS_train, prov_cob != 0.00)$prov_cob), decreasing = TRUE)[1]))
stats_prov_cob_sin_ceros <- rbind(stats_prov_cob_sin_ceros, data.frame(Estadístico = "Moda", Valor_sin_ceros = round(mode_value_prov_cob_sin_ceros, 2)))

# Fusionamos las dos tablas
stats_prov_cob <- left_join(stats_prov_cob, stats_prov_cob_sin_ceros, by = "Estadístico")

# Convertir la tabla a kbl
tabla_prov_cob <- kbl(stats_prov_cob, align = c("c", "c", "c"), col.names = c("Estadístico", "Valor", "Valor sin 0.00")) %>%
  kable_material()

tabla_prov_cob
Estadístico Valor Valor sin 0.00
Minimo 0.00 1.00
Maximo 10000.00 10000.00
Mediana 0.00 86.00
Media 23.08 233.57
Desviacion_Estandar 136.08 371.80
Varianza 18517.89 138232.23
Q1 0.00 37.00
Q3 0.00 351.00
Rango 10000.00 9999.00
Rango_Intercuartilico 0.00 314.00
Moda 0.00 53.00
# PLOT HISTOGRAMA PROVISIÓN COBERTURA
plot_hist_dens_prov_cob <- ggplot(LS_train, aes(x=prov_cob)) +
                              geom_histogram(aes(y=..density..), fill="#009494", bins=20) +
                              geom_density(alpha=0.2, color="#D55E00") + 
                              labs(title="Hist. y Dens. prov_cob", y="Densidad") +
                              theme(plot.title = element_text(hjust = 0.5))



# PLOT BOXPLOT PROVISIÓN COBERTURA
plot_boxplot_prov_cob <- ggplot(LS_train, aes(y=prov_cob)) +
                            geom_boxplot(fill="#009494", outlier.color="#D55E00", outlier.shape=16, outlier.size=2) +
                            labs(title="Boxplot prov_cob") +
                            theme(plot.title = element_text(hjust = 0.5))



# PLOT SCATTERPLOT PROVISIÓN COBERTURA
plot_geomplot_prov_cob <- ggplot(LS_train, aes(x=seq_along(prov_cob), y=prov_cob)) +
                             geom_point(color="#009494", alpha=0.4) +
                             labs(title="Scatter Plot prov_cob", x="Índice", y="Valor") +
                             theme(plot.title = element_text(hjust = 0.5))



# PLOT QQPLOT PROVISIÓN COBERTURA
plot_qqplot_prov_cob <- ggplot(LS_train, aes(sample=prov_cob)) +
                           stat_qq(distribution=stats::qnorm, dparams=list(mean=mean(LS_train$prov_cob, na.rm=TRUE), sd=sd(LS_train$prov_cob, na.rm=TRUE))) +
                           geom_abline(intercept=0, slope=1, color="#D55E00") +
                           labs(title="Q-Q Plot prov_cob") +
                           theme(plot.title = element_text(hjust = 0.5))



# Filtrar el dataset para excluir los valores de 0.00 en prov_cob
LS_train_filtered_prov_cob_0.00 <- LS_train %>% filter(prov_cob != 0.00)

# PLOT HISTOGRAMA PROVISIÓN COBERTURA SIN 0.00
plot_hist_dens_prov_cob_filtered_0.00 <- ggplot(LS_train_filtered_prov_cob_0.00, aes(x=prov_cob)) +
                                            geom_histogram(aes(y=..density..), fill="#009494", bins=20) +
                                            geom_density(alpha=0.2, color="#D55E00") + 
                                            labs(title="Hist. y Dens. prov_cob <> 0.00", y="Densidad") +
                                            theme(plot.title = element_text(hjust = 0.5))



# PLOT BOXPLOT PROVISIÓN COBERTURA SIN 0.00
plot_boxplot_prov_cob_filtered_0.00 <- ggplot(LS_train_filtered_prov_cob_0.00, aes(y=prov_cob)) +
                                          geom_boxplot(fill="#009494", outlier.color="#D55E00", outlier.shape=16, outlier.size=2) +
                                          labs(title="Boxplot prov_cob <> 0.00") +
                                          theme(plot.title = element_text(hjust = 0.5))



# PLOT SCATTERPLOT PROVISIÓN COBERTURA SIN 0.00
plot_geomplot_prov_cob_filtered_0.00 <- ggplot(LS_train_filtered_prov_cob_0.00, aes(x=seq_along(prov_cob), y=prov_cob)) +
                                           geom_point(color="#009494", alpha=0.4) +
                                           labs(title="Scatter Plot prov_cob <> 0.00", x="Índice", y="Valor") +
                                           theme(plot.title = element_text(hjust = 0.5))



# PLOT QQPLOT PROVISIÓN COBERTURA SIN 0.00
plot_qqplot_prov_cob_filtered_0.00 <- ggplot(LS_train_filtered_prov_cob_0.00, aes(sample=prov_cob)) +
                                         stat_qq(distribution=stats::qnorm, dparams=list(mean=mean(LS_train_filtered_prov_cob_0.00$prov_cob, na.rm=TRUE), sd=sd(LS_train_filtered_prov_cob_0.00$prov_cob, na.rm=TRUE))) +
                                         geom_abline(intercept=0, slope=1, color="#D55E00") +
                                         labs(title="Q-Q Plot prov_cob <> 0.00") +
                                         theme(plot.title = element_text(hjust = 0.5))
grid.arrange(plot_hist_dens_prov_cob,
             plot_hist_dens_prov_cob_filtered_0.00,
             ncol=2)

grid.arrange(plot_boxplot_prov_cob,
             plot_boxplot_prov_cob_filtered_0.00,
             ncol=2)

grid.arrange(plot_geomplot_prov_cob,
             plot_geomplot_prov_cob_filtered_0.00,
             ncol=2)

grid.arrange(plot_qqplot_prov_cob,
             plot_qqplot_prov_cob_filtered_0.00,
             ncol=2)


PAGO TOTAL COBERTURA

# Estadísticas descriptivas para pago_total_cob
stats_pago_total_cob <- LS_train %>%
  summarize(
    Minimo = round(min(pago_total_cob, na.rm = TRUE), 2),
    Maximo = round(max(pago_total_cob, na.rm = TRUE), 2),
    Mediana = round(median(pago_total_cob, na.rm = TRUE), 2),
    Media = round(mean(pago_total_cob, na.rm = TRUE), 2),
    Desviacion_Estandar = round(sd(pago_total_cob, na.rm = TRUE), 2),
    Varianza = round(var(pago_total_cob, na.rm = TRUE), 2),
    Q1 = round(quantile(pago_total_cob, 0.25, na.rm = TRUE), 2),
    Q3 = round(quantile(pago_total_cob, 0.75, na.rm = TRUE), 2)
  ) %>%
  mutate(
    Rango = round(Maximo - Minimo, 2),
    Rango_Intercuartilico = round(Q3 - Q1, 2)
  ) %>%
  gather("Estadístico", "Valor")

# Estadísticas descriptivas para pago_total_cob excluyendo 0.00
stats_pago_total_cob_sin_ceros <- LS_train %>%
  filter(pago_total_cob != 0.00) %>%
  summarize(
    Minimo = round(min(pago_total_cob, na.rm = TRUE), 2),
    Maximo = round(max(pago_total_cob, na.rm = TRUE), 2),
    Mediana = round(median(pago_total_cob, na.rm = TRUE), 2),
    Media = round(mean(pago_total_cob, na.rm = TRUE), 2),
    Desviacion_Estandar = round(sd(pago_total_cob, na.rm = TRUE), 2),
    Varianza = round(var(pago_total_cob, na.rm = TRUE), 2),
    Q1 = round(quantile(pago_total_cob, 0.25, na.rm = TRUE), 2),
    Q3 = round(quantile(pago_total_cob, 0.75, na.rm = TRUE), 2)
  ) %>%
  mutate(
    Rango = round(Maximo - Minimo, 2),
    Rango_Intercuartilico = round(Q3 - Q1, 2)
  ) %>%
  gather("Estadístico", "Valor_sin_ceros")

# Agregamos la moda como una fila adicional con 0.00 y sin 0.00
mode_value_pago_total_cob <- as.numeric(names(sort(table(LS_train$pago_total_cob), decreasing = TRUE)[1]))
stats_pago_total_cob <- rbind(stats_pago_total_cob, data.frame(Estadístico = "Moda", Valor = round(mode_value_pago_total_cob, 2)))

mode_value_pago_total_cob_sin_ceros <- as.numeric(names(sort(table(filter(LS_train, pago_total_cob != 0.00)$pago_total_cob), decreasing = TRUE)[1]))
stats_pago_total_cob_sin_ceros <- rbind(stats_pago_total_cob_sin_ceros, data.frame(Estadístico = "Moda", Valor_sin_ceros = round(mode_value_pago_total_cob_sin_ceros, 2)))

# Fusionamos las dos tablas
stats_pago_total_cob <- left_join(stats_pago_total_cob, stats_pago_total_cob_sin_ceros, by = "Estadístico")

# Convertir la tabla a kbl
tabla_pago_total_cob <- kbl(stats_pago_total_cob, align = c("c", "c", "c"), col.names = c("Estadístico", "Valor", "Valor sin 0.00")) %>%
  kable_material()

tabla_pago_total_cob
Estadístico Valor Valor sin 0.00
Minimo -544.50 -544.50
Maximo 10500.00 10500.00
Mediana 0.00 115.23
Media 125.28 311.27
Desviacion_Estandar 457.35 679.57
Varianza 209171.14 461811.53
Q1 0.00 100.43
Q3 104.55 187.38
Rango 11044.50 11044.50
Rango_Intercuartilico 104.55 86.95
Moda 0.00 100.43
# PLOT HISTOGRAMA PAGO TOTAL COBERTURA
plot_hist_dens_pago_total_cob <- ggplot(LS_train, aes(x=pago_total_cob)) +
                            geom_histogram(aes(y=..density..), fill="#009494", bins=20) +
                            geom_density(alpha=0.2, color="#D55E00") + 
                            labs(title="Hist. y Dens. pago_total_cob", y="Densidad") +
                            theme(plot.title = element_text(hjust = 0.5))



# PLOT BOXPLOT PAGO TOTAL COBERTURA
plot_boxplot_pago_total_cob <- ggplot(LS_train, aes(y=pago_total_cob)) +
                          geom_boxplot(fill="#009494", outlier.color="#D55E00", outlier.shape=16, outlier.size=2) +
                          labs(title="Boxplot pago_total_cob") +
                          theme(plot.title = element_text(hjust = 0.5))



# PLOT SCATTERPLOT PAGO TOTAL COBERTURA
plot_geomplot_pago_total_cob <- ggplot(LS_train, aes(x=seq_along(pago_total_cob), y=pago_total_cob)) +
                           geom_point(color="#009494", alpha=0.4) +
                           labs(title="Scatter Plot pago_total_cob", x="Índice", y="Valor") +
                           theme(plot.title = element_text(hjust = 0.5))



# PLOT QQPLOT PAGO TOTAL COBERTURA
plot_qqplot_pago_total_cob <- ggplot(LS_train, aes(sample=pago_total_cob)) +
                         stat_qq(distribution=stats::qnorm, dparams=list(mean=mean(LS_train$pago_total_cob, na.rm=TRUE), sd=sd(LS_train$pago_total_cob, na.rm=TRUE))) +
                         geom_abline(intercept=0, slope=1, color="#D55E00") +
                         labs(title="Q-Q Plot pago_total_cob") +
                         theme(plot.title = element_text(hjust = 0.5))



# Filtrar el dataset para excluir los valores de 0.00 en pago_total_cob
LS_train_filtered_pago_total_cob_0.00 <- LS_train %>% filter(pago_total_cob != 0.00)

# PLOT HISTOGRAMA PAGO TOTAL COBERTURA SIN 0.00
plot_hist_dens_pago_total_cob_filtered_0.00 <- ggplot(LS_train_filtered_pago_total_cob_0.00, aes(x=pago_total_cob)) +
                                                  geom_histogram(aes(y=..density..), fill="#009494", bins=20) +
                                                  geom_density(alpha=0.2, color="#D55E00") + 
                                                  labs(title="Hist. y Dens. pago_total_cob <> 0.00", y="Densidad") +
                                                  theme(plot.title = element_text(hjust = 0.5))



# PLOT BOXPLOT PAGO TOTAL COBERTURA SIN 0.00
plot_boxplot_pago_total_cob_filtered_0.00 <- ggplot(LS_train_filtered_pago_total_cob_0.00, aes(y=pago_total_cob)) +
                                                geom_boxplot(fill="#009494", outlier.color="#D55E00", outlier.shape=16, outlier.size=2) +
                                                labs(title="Boxplot pago_total_cob <> 0.00") +
                                                theme(plot.title = element_text(hjust = 0.5))



# PLOT SCATTERPLOT PAGO TOTAL COBERTURA SIN 0.00
plot_geomplot_pago_total_cob_filtered_0.00 <- ggplot(LS_train_filtered_pago_total_cob_0.00, aes(x=seq_along(pago_total_cob), y=pago_total_cob)) +
                                                 geom_point(color="#009494", alpha=0.4) +
                                                 labs(title="Scatter Plot pago_total_cob <> 0.00", x="Índice", y="Valor") +
                                                 theme(plot.title = element_text(hjust = 0.5))



# PLOT QQPLOT PAGO TOTAL COBERTURA SIN 0.00
plot_qqplot_pago_total_cob_filtered_0.00 <- ggplot(LS_train_filtered_pago_total_cob_0.00, aes(sample=pago_total_cob)) +
                                               stat_qq(distribution=stats::qnorm, dparams=list(mean=mean(LS_train_filtered_pago_total_cob_0.00$pago_total_cob, na.rm=TRUE), sd=sd(LS_train_filtered_pago_total_cob_0.00$pago_total_cob, na.rm=TRUE))) +
                                               geom_abline(intercept=0, slope=1, color="#D55E00") +
                                               labs(title="Q-Q Plot pago_total_cob <> 0.00") +
                                               theme(plot.title = element_text(hjust = 0.5))
grid.arrange(plot_hist_dens_pago_total_cob,
             plot_hist_dens_pago_total_cob_filtered_0.00,
             ncol=2)

grid.arrange(plot_boxplot_pago_total_cob,
             plot_boxplot_pago_total_cob_filtered_0.00,
             ncol=2)

grid.arrange(plot_geomplot_pago_total_cob,
             plot_geomplot_pago_total_cob_filtered_0.00,
             ncol=2)

grid.arrange(plot_qqplot_pago_total_cob,
             plot_qqplot_pago_total_cob_filtered_0.00,
             ncol=2)


COSTE TOTAL COBERTURA

# Estadísticas descriptivas para coste_total_cob
stats_coste_total_cob <- LS_train %>%
  summarize(
    Minimo = round(min(coste_total_cob, na.rm = TRUE), 2),
    Maximo = round(max(coste_total_cob, na.rm = TRUE), 2),
    Mediana = round(median(coste_total_cob, na.rm = TRUE), 2),
    Media = round(mean(coste_total_cob, na.rm = TRUE), 2),
    Desviacion_Estandar = round(sd(coste_total_cob, na.rm = TRUE), 2),
    Varianza = round(var(coste_total_cob, na.rm = TRUE), 2),
    Q1 = round(quantile(coste_total_cob, 0.25, na.rm = TRUE), 2),
    Q3 = round(quantile(coste_total_cob, 0.75, na.rm = TRUE), 2)
  ) %>%
  mutate(
    Rango = round(Maximo - Minimo, 2),
    Rango_Intercuartilico = round(Q3 - Q1, 2)
  ) %>%
  gather("Estadístico", "Valor")

# Estadísticas descriptivas para coste_total_cob excluyendo 0.00
stats_coste_total_cob_sin_ceros <- LS_train %>%
  filter(coste_total_cob != 0.00) %>%
  summarize(
    Minimo = round(min(coste_total_cob, na.rm = TRUE), 2),
    Maximo = round(max(coste_total_cob, na.rm = TRUE), 2),
    Mediana = round(median(coste_total_cob, na.rm = TRUE), 2),
    Media = round(mean(coste_total_cob, na.rm = TRUE), 2),
    Desviacion_Estandar = round(sd(coste_total_cob, na.rm = TRUE), 2),
    Varianza = round(var(coste_total_cob, na.rm = TRUE), 2),
    Q1 = round(quantile(coste_total_cob, 0.25, na.rm = TRUE), 2),
    Q3 = round(quantile(coste_total_cob, 0.75, na.rm = TRUE), 2)
  ) %>%
  mutate(
    Rango = round(Maximo - Minimo, 2),
    Rango_Intercuartilico = round(Q3 - Q1, 2)
  ) %>%
  gather("Estadístico", "Valor_sin_ceros")

# Agregamos la moda como una fila adicional con 0.00 y sin 0.00
mode_value_coste_total_cob <- as.numeric(names(sort(table(LS_train$coste_total_cob), decreasing = TRUE)[1]))
stats_coste_total_cob <- rbind(stats_coste_total_cob, data.frame(Estadístico = "Moda", Valor = round(mode_value_coste_total_cob, 2)))

mode_value_coste_total_cob_sin_ceros <- as.numeric(names(sort(table(filter(LS_train, coste_total_cob != 0.00)$coste_total_cob), decreasing = TRUE)[1]))
stats_coste_total_cob_sin_ceros <- rbind(stats_coste_total_cob_sin_ceros, data.frame(Estadístico = "Moda", Valor_sin_ceros = round(mode_value_coste_total_cob_sin_ceros, 2)))

# Fusionamos las dos tablas
stats_coste_total_cob <- left_join(stats_coste_total_cob, stats_coste_total_cob_sin_ceros, by = "Estadístico")

# Convertir la tabla a kbl
tabla_coste_total_cob <- kbl(stats_coste_total_cob, align = c("c", "c", "c"), col.names = c("Estadístico", "Valor", "Valor sin 0.00")) %>%
  kable_material()

tabla_coste_total_cob
Estadístico Valor Valor sin 0.00
Minimo -544.50 -544.50
Maximo 10575.69 10575.69
Mediana 0.00 117.67
Media 148.37 323.80
Desviacion_Estandar 475.80 661.26
Varianza 226383.50 437264.81
Q1 0.00 100.43
Q3 112.29 257.74
Rango 11120.19 11120.19
Rango_Intercuartilico 112.29 157.31
Moda 0.00 100.43
# PLOT HISTOGRAMA COSTE TOTAL COBERTURA
plot_hist_dens_coste_total_cob <- ggplot(LS_train, aes(x=coste_total_cob)) +
                             geom_histogram(aes(y=..density..), fill="#009494", bins=20) +
                             geom_density(alpha=0.2, color="#D55E00") + 
                             labs(title="Hist. y Dens. coste_total_cob", y="Densidad") +
                             theme(plot.title = element_text(hjust = 0.5))



# PLOT BOXPLOT COSTE TOTAL COBERTURA
plot_boxplot_coste_total_cob <- ggplot(LS_train, aes(y=coste_total_cob)) +
                           geom_boxplot(fill="#009494", outlier.color="#D55E00", outlier.shape=16, outlier.size=2) +
                           labs(title="Boxplot coste_total_cob") +
                           theme(plot.title = element_text(hjust = 0.5))



# PLOT SCATTERPLOT COSTE TOTAL COBERTURA
plot_geomplot_coste_total_cob <- ggplot(LS_train, aes(x=seq_along(coste_total_cob), y=coste_total_cob)) +
                            geom_point(color="#009494", alpha=0.4) +
                            labs(title="Scatter Plot coste_total_cob", x="Índice", y="Valor") +
                            theme(plot.title = element_text(hjust = 0.5))



# PLOT QQPLOT COSTE TOTAL COBERTURA
plot_qqplot_coste_total_cob <- ggplot(LS_train, aes(sample=coste_total_cob)) +
                          stat_qq(distribution=stats::qnorm, dparams=list(mean=mean(LS_train$coste_total_cob, na.rm=TRUE), sd=sd(LS_train$coste_total_cob, na.rm=TRUE))) +
                          geom_abline(intercept=0, slope=1, color="#D55E00") +
                          labs(title="Q-Q Plot coste_total_cob") +
                          theme(plot.title = element_text(hjust = 0.5))



# Filtrar el dataset para excluir los valores de 0.00 en coste_total_cob
LS_train_filtered_coste_total_cob_0.00 <- LS_train %>% filter(coste_total_cob != 0.00)

# PLOT HISTOGRAMA COSTE TOTAL COBERTURA SIN 0.00
plot_hist_dens_coste_total_cob_filtered_0.00 <- ggplot(LS_train_filtered_coste_total_cob_0.00, aes(x=coste_total_cob)) +
                                                   geom_histogram(aes(y=..density..), fill="#009494", bins=20) +
                                                   geom_density(alpha=0.2, color="#D55E00") + 
                                                   labs(title="Hist. y Dens. coste_total_cob <> 0.00", y="Densidad") +
                                                   theme(plot.title = element_text(hjust = 0.5))



# PLOT BOXPLOT COSTE TOTAL COBERTURA SIN 0.00
plot_boxplot_coste_total_cob_filtered_0.00 <- ggplot(LS_train_filtered_coste_total_cob_0.00, aes(y=coste_total_cob)) +
                                                 geom_boxplot(fill="#009494", outlier.color="#D55E00", outlier.shape=16, outlier.size=2) +
                                                 labs(title="Boxplot coste_total_cob <> 0.00") +
                                                 theme(plot.title = element_text(hjust = 0.5))



# PLOT SCATTERPLOT COSTE TOTAL COBERTURA SIN 0.00
plot_geomplot_coste_total_cob_filtered_0.00 <- ggplot(LS_train_filtered_coste_total_cob_0.00, aes(x=seq_along(coste_total_cob), y=coste_total_cob)) +
                                                  geom_point(color="#009494", alpha=0.4) +
                                                  labs(title="Scatter Plot coste_total_cob <> 0.00", x="Índice", y="Valor") +
                                                  theme(plot.title = element_text(hjust = 0.5))



# PLOT QQPLOT COSTE TOTAL COBERTURA SIN 0.00
plot_qqplot_coste_total_cob_filtered_0.00 <- ggplot(LS_train_filtered_coste_total_cob_0.00, aes(sample=coste_total_cob)) +
                                                stat_qq(distribution=stats::qnorm, dparams=list(mean=mean(LS_train_filtered_coste_total_cob_0.00$coste_total_cob, na.rm=TRUE), sd=sd(LS_train_filtered_coste_total_cob_0.00$coste_total_cob, na.rm=TRUE))) +
                                                geom_abline(intercept=0, slope=1, color="#D55E00") +
                                                labs(title="Q-Q Plot coste_total_cob <> 0.00") +
                                                theme(plot.title = element_text(hjust = 0.5))
grid.arrange(plot_hist_dens_coste_total_cob,
             plot_hist_dens_coste_total_cob_filtered_0.00,
             ncol=2)

grid.arrange(plot_boxplot_coste_total_cob,
             plot_boxplot_coste_total_cob_filtered_0.00,
             ncol=2)

grid.arrange(plot_geomplot_coste_total_cob,
             plot_geomplot_coste_total_cob_filtered_0.00,
             ncol=2)

grid.arrange(plot_qqplot_coste_total_cob,
             plot_qqplot_coste_total_cob_filtered_0.00,
             ncol=2)


RESUMEN SINIESTROS

total_siniestros <- nrow(LS_train)



# Para prov_inicial_cob
cantidad_prov_inicial_0.00 <- nrow(LS_train %>% filter(prov_inicial_cob == 0.00))
porcentaje_prov_inicial_0.00 <- round((cantidad_prov_inicial_0.00 / total_siniestros) * 100, 2)

cantidad_prov_inicial_no_0.00 <- nrow(LS_train %>% filter(prov_inicial_cob != 0.00))
porcentaje_prov_inicial_no_0.00 <- round((cantidad_prov_inicial_no_0.00 / total_siniestros) * 100, 2)



# Para prov_cob
cantidad_prov_cob_0.00 <- nrow(LS_train %>% filter(prov_cob == 0.00))
porcentaje_prov_cob_0.00 <- round((cantidad_prov_cob_0.00 / total_siniestros) * 100, 2)

cantidad_prov_cob_no_0.00 <- nrow(LS_train %>% filter(prov_cob != 0.00))
porcentaje_prov_cob_no_0.00 <- round((cantidad_prov_cob_no_0.00 / total_siniestros) * 100, 2)



# Para pago_total_cob
cantidad_pago_total_0.00 <- nrow(LS_train %>% filter(pago_total_cob == 0.00))
porcentaje_pago_total_0.00 <- round((cantidad_pago_total_0.00 / total_siniestros) * 100, 2)

cantidad_pago_total_no_0.00 <- nrow(LS_train %>% filter(pago_total_cob != 0.00))
porcentaje_pago_total_no_0.00 <- round((cantidad_pago_total_no_0.00 / total_siniestros) * 100, 2)



# Para coste_total_cob
cantidad_coste_total_0.00 <- nrow(LS_train %>% filter(coste_total_cob == 0.00))
porcentaje_coste_total_0.00 <- round((cantidad_coste_total_0.00 / total_siniestros) * 100, 2)

cantidad_coste_total_no_0.00 <- nrow(LS_train %>% filter(coste_total_cob != 0.00))
porcentaje_coste_total_no_0.00 <- round((cantidad_coste_total_no_0.00 / total_siniestros) * 100, 2)



# Presentar los resultados
resumen_siniestros <- data.frame(
  Variable = c("prov_inicial_cob", "prov_cob", "pago_total_cob", "coste_total_cob"),
  Cantidad_0.00 = c(cantidad_prov_inicial_0.00, cantidad_prov_cob_0.00, cantidad_pago_total_0.00, cantidad_coste_total_0.00),
  Porcentaje_0.00 = c(porcentaje_prov_inicial_0.00, porcentaje_prov_cob_0.00, porcentaje_pago_total_0.00, porcentaje_coste_total_0.00),
  Cantidad_no_0.00 = c(cantidad_prov_inicial_no_0.00, cantidad_prov_cob_no_0.00, cantidad_pago_total_no_0.00, cantidad_coste_total_no_0.00),
  Porcentaje_no_0.00 = c(porcentaje_prov_inicial_no_0.00, porcentaje_prov_cob_no_0.00, porcentaje_pago_total_no_0.00, porcentaje_coste_total_no_0.00)
)

# Presentar los resultados en una tabla estilizada con kbl
resumen_siniestros_kbl <- kbl(resumen_siniestros, align = c("c", "c", "c", "c")) %>%
  kable_material()

resumen_siniestros_kbl
Variable Cantidad_0.00 Porcentaje_0.00 Cantidad_no_0.00 Porcentaje_no_0.00
prov_inicial_cob 240 0.33 71725 99.67
prov_cob 64853 90.12 7112 9.88
pago_total_cob 43000 59.75 28965 40.25
coste_total_cob 38990 54.18 32975 45.82


Las conclusiones que podemos sacar tras este análisis univariante cuantitativo son las siguientes:

  • Hay excasos registros que tengan 0.00€ de provisión inicial, apenas un 0.33%, y esto tiene sentido porque cuando se comunica un siniestro y se abre, siempre debe llevar aparejado un importe estimado de coste al que llamamos reserva o reserva inicial. En todo caso, los 240 siniestros cuyo importe de reserva inicial es 0.00€ son siniestros que se han aperturado mal y en su momento el tramitador cometió el error de no grabar ninguna reserva. No apreciamos apenas diferencias en los estadísticos con zeros y sin ellos, así como el los gráficos que llevan aparejados. Vemos una gran cantidad de datos por debajo de los 130€ y luego diversos datos atípicos.

  • Respecto a la variable provisión cobertura si que hay diferencias significativas en los estadísticos si quitamos los zeros de los que no. El procentaje de siniestros con prov_cob 0.00 es del 90% lo que tiene bastante sentido si nos percatamos de que el mismo porcentaje de siniestros está cerrado. Esto es una máxima en el mundo de los seguros, todo siniestro abierto tiene que tener una provisión / reserva, y todo siniestro cerrado tiene que tener esta variable a 0, si no, sería una incongruencia. La provisión media se sitúa en torno a los 230€ pero tiene una desviación estándar bastante alta. Hay diversos datos atípicos o también llamados siniestros punta por encima de los 2.000€.

  • En cuenta a la variable pago total por cobertura sucede lo mismo que con la anterior, existen diferencias entre eliminar los siniestros coste zero ya que aumenta el valor medio de las indemnizaciones de 125€ a más de 300€; y esto se debe a que en la bbdds actual casi un 60% de los siniestros no tienen pagos.

  • Coste total por cobertura: es el dato cuantitativo realmente relevante en este análisis ya que tiene en cuenta los pagos y reservas anteriores y revela cual será el coste real de un siniestro. Efectivamente al igual que sucede con prov_cob y pagos_total_cob, también hay diferencias entre considerar los siniestros zero y no considerarlos ya que la realidad de LS Insurance es que casi el 55% de los siniestros acaban siendo siniestros con coste 0.


SINIESTROS PUNTA



4 Análisis multivariante



5 Procesado de variables cualitativas



6 Modelo de regresión lineal



7 Conclusiones preliminares



8 Aprendizaje no supervisado

8.1 K-Means



9 Técnicas de reducción de la dimensionalidad

9.1 PCA



10 Aprendizaje supervisado

10.1 GLM

10.2 KNN

10.3 DECISION TREES

10.4 RANDOM FOREST

10.5 SVM



11 Evaluación y comparación de modelos

11.1 K-fold Cross Validation

11.2 N-fold Cross Validation



11.3 Conclusiones


12 Punto de corte ROC


13 Deep Learning



14 Explicabilidad



15 Series Temporales